2015-11-16 52 views
1

我試圖讓測試 使用直通方法,但投擲的錯誤如何在控制器中進行REST API調用單元測試?

一個真正的呼叫,並指定作用域

代碼如下所示: -

describe('Controller: MainCtrl', function() { 

      // load the controller's module 
      beforeEach(module('w00App')); 

      var scope, MainCtrl, $httpBackend; 

      // Initialize the controller and a mock scope 
      beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) { 
        $httpBackend = _$httpBackend_; 
        $httpBackend.expectGET('http://api.some.com/testdata').passThrough(); 


        scope = $rootScope.$new(); 
        MainCtrl = $controller('MainCtrl', { 
          $scope: scope 
        }); 
      })); it('should make a post to refresh the friends list and return matching users', function(){ 

       var deferredResponse = $httpBackend.expectGET('http://api.some.com/testdata').passThrough(); 
       console.log('response'+JSON.stringidy(deferredResponse)); 

       $httpBackend.flush(); 

      // expect(deferredResponse).toEqual(deferredResponse); 
      }); }); 

Error :- TypeError: 'undefined' is not a function (near '... ').passThrough();...') .....

我怎麼能調用和分配作用域像在Real控制器中?請幫助..它讓我的生活變得輕鬆。

回答

1

當測試一個真正的控制器,並在控制器內部進行一些REST調用時,最好是嘲笑那些響應調用,通過$httpBackend對象攔截調用。

jasmine.getJSONFixtures().fixturesPath = 'base/test/unit/authz/api_mock/'; 
    $httpBackend.when('POST', CONFIG.get('MAIN_URL_FOR_REST_SERVICES') + 'actions/search').respond(function() { 
     return [200, window.getJSONFixture('actions.json')]; 
    }); 

至少,這是我如何繼續測試控制器。

,如果你真的想調用備份使用:

$http.get(YOUR_URL).success(function(data) { 
    --- your test --- 
}); 

,不要忘記做的beforeEach方法注入HTTP服務:

beforeEach(inject(function(_$http_) { 
    $http = _$http_; 
})); 
+0

window.getJSONFixture('actions.json ')是一個模擬JSON的權利? – Prasad

+0

是的,這是嘲諷的迴應 – aurelius

+0

是不是可能得到Api的真實反應到$範圍?就像在Real控制器中一樣,您能否讓我知道需要注入什麼jasmine.getJSONFixtures() – Prasad

相關問題