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

How to make a REST API call in a controller Unit test?

我正在尝试进行真正的调用并分配测试范围 使用 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);
          }); });

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

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

当测试一个真正的控制器并且在控制器内部对支持的进行一些 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_;
}));