$ httpBackend没有存根请求/响应?

时间:2014-08-06 17:09:28

标签: angularjs jasmine

我正在尝试测试我的$scope.init(id)功能。在这个函数中,我向我的API发出请求,返回一个对象数组,所以我想用预设的响应将其存根。

这是我失败的测试:

describe('mysite', function() {
  var scope, MensDetailCtrl, $httpBackend;
  beforeEach(function() {
    module('mysite');
  });

  describe('MensDetailCtrl', function() {
    beforeEach(inject(function($controller, $rootScope, $injector) {
      scope = $rootScope.$new();

      $httpBackend = $injector.get('$httpBackend');
      $httpBackend.when('GET', '/api/products/1').respond({name: 'product_name'});

      MensDetailCtrl = $controller('MensDetailCtrl', {
        '$scope': scope
      });
    }));


    describe('init(id)', function() {
      it('sets scope.product', function() {
        scope.init(1);
        console.log(scope.product.name); // HERE: prints undefined
        expect(scope.product).toBeDefined();
      });


    });


  });

});

这是我的控制者:

app.controller('MensDetailCtrl', ['$scope', '$resource', '$controller', 'Product', function($scope, $resource, $controller, Product) {
  $controller('ProductsDetailCtrl', {$scope: $scope});


  $scope.init = function(id)
  {
    console.log("zzzzz"); // this is printed
    $scope.product = Product.get({productId: id}, function(data) {
      console.log("here!!!"); // this is not printed
    });

  }
   ...

}]);

我的工厂:

app.factory('Product', ['$resource', function($resource) {
  return $resource("/api/products/:productId", {}, {
    query: {method: 'GET', isArray: true},
  });
}]);

我是不是已经使用此$httpBackend.when('GET', '/api/products/1').respond({name: 'product_name'});将其删除了?

1 个答案:

答案 0 :(得分:2)

您需要致电$httpBackend.flush()。这就是我们如何在测试中解决HTTP请求的异步性质。

describe('init(id)', function() {
  it('sets scope.product', function() {
    scope.init(1);
    $httpBackend.flush();
    console.log(scope.product.name); // HERE: prints undefined
    expect(scope.product).toBeDefined();
  });
});

另外,对于这种测试,我喜欢使用httpBackend.expectGET('/api/products/1').respond(...)。原因是您的测试期望此HTTP请求,如果没有,则会失败。当它失败时,将在错误消息中更清楚原因。

修改

documentation很好地解释了何时使用"当"与"期待"方法。 拨打$httpBackend.verifyNoOutstandingExpectation()$httpBackend.verifyNoOutstandingRequest()(可能在afterEach()区块中)也是一个好主意。