如何在控制器单元测试中进行REST API调用?

时间:2015-11-16 12:14:44

标签: angularjs angular-mock

我正在尝试进行真正的调用和分配范围以进行测试 使用 passThrough 方法但投掷错误

代码遵循: -

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);
          }); });
  

错误: - TypeError:'undefined'不是函数(靠近'...   ')。passThrough(); ...').....

如何在真实控制器中调用和分配范围?请帮助..它让我的生活变得轻松。

1 个答案:

答案 0 :(得分: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_;
}));