5

在 Angular js 单元测试中,我想为每个测试设置 xhr 响应(在“it”方法中),而不是在 beforeEach 方法中,但它似乎不起作用。?

这有效

describe('ExampleListCtrl', function(){
  var $scope, $httpBackend;

  beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) {
    $httpBackend = _$httpBackend_;
    $httpBackend.expectGET('examples').respond([]);   // <--- THIS ONE
    $controller(ExampleListCtrl, {$scope: $scope = $rootScope.$new()});
  }));

  it('should create "examples"  with 0 example fetched', function() {
    expect($scope.examples).toBeUndefined();
    $httpBackend.flush();
    expect($scope.examples).toEqual([]);
  });

});

结果

Executed 8 of 8 SUCCESS (0.366 secs / 0.043 secs)

但是当我将 expectGet 方法移动到每个方法时,这会失败并出现错误。我不知道为什么。

describe('ExampleListCtrl', function(){
  var $scope, $httpBackend;

  beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) {
    $httpBackend = _$httpBackend_;
    $controller(ExampleListCtrl, {$scope: $scope = $rootScope.$new()});
  }));

  it('should create "examples"  with 0 example fetched', function() {
    $httpBackend.expectGET('examples').respond([]);  // <--- MOVED TO HERE
    expect($scope.examples).toBeUndefined();
    $httpBackend.flush();
    expect($scope.examples).toEqual([]);
  });
});

这是错误

....
at /Users/me/app/test/unit/controllers/ExampleListCtrlSpec.js:3:1
      Error: No pending request to flush
at Error (<anonymous>)
at Function.$httpBackend.flush (/Users/me/app/test/lib/angular/angular-mocks.js:1171:34)
at null.<anonymous> (/Users/me/app/test/unit/controllers/ExampleListCtrlSpec.js:14:18)

----已编辑----

按照下面的建议,我将控制器从 beforeEach 中移出,并像这样更改了测试,以便我可以多次测试 $httpBackend.expectGET。

describe('ExampleListCtrl', function(){
  var $scope, $rootScope, $httpBackend;

  beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) {
    $httpBackend = _$httpBackend_;
    controller = $controller;
    $scope = $rootScope.$new();
  }));

  it('should create "examples" model with 0 example fetched from xhr', function() {
    $httpBackend.expectGET('examples').respond([]);
    controller(ExampleListCtrl, {$scope: $scope});
    $httpBackend.flush();
    expect($scope.examples).toEqual([]);
  });

});
4

1 回答 1

7

发生这种情况是因为一旦您实例化您的控制器,它就会获取$http,因此,$httBackend. 因此,所有期望都应在要求之前做出。

如果您希望将您的移动$httpBackend.expectGet到规范(it块),那么您也需要$controller(ExempleListCtrl, ...在期望之后移动您的。

于 2013-04-12T23:31:26.573 回答