无法为 ngMockE2E 使用 httpBackend flush

Unable to use httpBackend flush for ngMockE2E

我正在尝试使用 jasmine 测试我的控制器。基本上,当创建控制器时,它会调用一个服务来发出 http 请求。我正在使用 httpBackend 来获取虚假数据。当我尝试 运行 测试时,我总是得到错误 "No pending request to flush"。如果我删除 httpBackend.flush() 则测试失败,因为 controller.data.name 未定义。谁能知道为什么会这样?谢谢

模块代码在这里:

var myModule = angular.module('myModule', ['ngMockE2E']);
myModule.run(function($httpBackend){
  $httpBackend.whenGET('/Person?content=Manager').respond(function (){
     var response = {'name':'Bob','age':'43'}
     return [200,response];
  })
});

服务代码:

myModule.factory('myService',function($http){
     return {
        getData: function(position){
             return  $http.get('/Person?content='+position); 
        }
     }
});

控制器的代码是:

myModule.controller('myController',function(xrefService){
    var _this = this;
    _this.data ={};
    _this.getData = function(position){
        myService.getData(position).then(function(response){
            _this.data = response.data
        });
    }
    _this.getData("Manager");
})

测试控制器的代码是:

describe("Test Controller",function(){
   var controller,httpBackend,createController;
   beforeEach(module('myModule'));
   beforeEach(inject(function($controller,$httpBackend){      
      createController = function(){
         return $controller('myController');
      }
      httpBackend = $httpBackend;     
   }));
   it("should return data",function(){
      controller = createController();
      httpBackend.flush();
      expect(controller.data.name).toEqual("Bob");
   });      
})

您正在 "The code for the module"

中使用 $httpBackend.whenGET

您应该在测试代码中使用 $httpBackend 如下...

it("should return data",function(){
  $httpBackend.expectGET('/Person?content=Manager').respond(function (){
      var response = {'name':'Bob','age':'43'}
      return [200,response];
  })
  controller = createController();
  httpBackend.flush();
  expect(controller.data.name).toEqual("Bob");
});      

另外我建议使用 expectGET 而不是 whenGET。

whenGET 你是说如果请求被发出然后像这样响应。

用 expectGET 你是说...将发出一个请求,当它做出响应时,如果没有发出请求,则测试失败。

PS 如果您在控制器代码中放置了一些 console.log 语句,那么当您 运行 测试套件时,您应该会看到这些日志语句。如果没有,那么您知道您的控制器代码甚至没有被命中。

也用..

afterEach(function () {
      httpBackend.verifyNoOutstandingExpectation();
      httpBackend.verifyNoOutstandingRequest();
});

如果没有达到预期,这将强制测试失败。

angular documentation 说了以下关于 ngMockE2E 的 $httpbackend 的内容:

Additionally, we don't want to manually have to flush mocked out requests like we do during unit testing. For this reason the e2e $httpBackend flushes mocked out requests automatically, closely simulating the behavior of the XMLHttpRequest object.

所以,简短的回答:它不存在,你不需要它。