Angularjs 无法对ngMockE2E使用httpBackend刷新
我试图用jasmine测试我的控制器。基本上,当控制器被创建时,它将调用一个服务来发出http请求。我正在使用httpBackend获取假数据。当我试着运行测试时,我总是得到一个错误:没有待处理的刷新请求。如果删除httpBackend.flush,则测试失败,因为controller.data.name未定义。有人知道为什么会这样吗?谢谢 模块的代码如下所示:Angularjs 无法对ngMockE2E使用httpBackend刷新,angularjs,karma-jasmine,httpbackend,ngmocke2e,Angularjs,Karma Jasmine,Httpbackend,Ngmocke2e,我试图用jasmine测试我的控制器。基本上,当控制器被创建时,它将调用一个服务来发出http请求。我正在使用httpBackend获取假数据。当我试着运行测试时,我总是得到一个错误:没有待处理的刷新请求。如果删除httpBackend.flush,则测试失败,因为controller.data.name未定义。有人知道为什么会这样吗?谢谢 模块的代码如下所示: var myModule = angular.module('myModule', ['ngMockE2E']); myModule.
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");
});
})
您正在模块代码中使用$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
当你说如果有人提出请求,那么就这样回答
你是说。。。将发出请求,当请求做出这样的响应时,如果未发出请求,则测试失败
PS如果在控制器代码中放入一些console.log语句,那么在运行测试套件时应该会看到这些日志语句。如果没有,那么你知道你的控制器代码甚至没有被击中
也使用
afterEach(function () {
httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
});
如果未达到预期,这将导致测试失败。关于ngMockE2E的$httpbackend,如下所述:
此外,我们不想手动刷新模拟
像我们在单元测试期间所做的请求。因此,e2e
$httpBackend自动、紧密地刷新模拟请求
模拟XMLHttpRequest对象的行为
所以,简短的回答是:它不存在,你也不需要它。谢谢你,现在就可以了。然而,我想知道我们是否可以避免在测试方法中使用expectGET.Response。因为这意味着我需要读取服务代码来测试控制器。例如,我可能只是想测试controller.data是否为空,这意味着它从后端接收一些数据。现在你的想法是:是的,你想使用Jasmine spy。spyOnmyService,'getData'。and.callFakefunction{var def=$q.defer;def.resolveYOUR_MOCK_HTTP_RESPONSE;return def.promise;};expectmyService.getData.To已被调用;代码是说。。。当调用myService.getData时,使用假响应进行响应。伪响应返回一个承诺,就像您的真实方法返回一个承诺一样。然后你可以监视你的服务函数,查看它被调用了多少次,调用它的参数是什么,等等。你可以继续检查controller.data no probs中的值-现在将由你在fak响应中提供的假数据填充。上帝保佑:忘了提一下,你真正的HTTP现在不会被调用了,所以你不需要再去expectGET了。谢谢danday74,它真的很有帮助D