我正在尝试在Angular框架中测试一个控制器:
.controller('UserCtrl', ['$scope', '$location', 'User', 'Config',
function ($scope, $location, User, Config) {
...
}])
此控制器依赖于需要$ http对象进行服务器调用的几个服务:
.factory('User', ['$http', function ($http) {
var data = {};
return {
query: function(oper, putdata, callback){
if(oper == 'get'){
$http.get(getUrl("user",null)).success(function(data2) {
console.log(data2);
callback(data2);
data.userinfo = data2;
});
},
userinfo: data
};
}])
但是当我尝试引导控制器时,我无法使httpBackend工作:
describe('UserCtrl', function(){
var ctrlScope, ctrl, $httpBackend, controllerService;
beforeEach(
inject(function($httpBackend, $http, $rootScope, $controller, User, Config) {
_User = User;
_Config = Config;
spyOn(User, 'getUserInfo').andCallThrough();
//spyOn(User, 'query').andCallThrough();
ctrlScope = $rootScope.$new();
controllerService = $controller;
httpMock = $httpBackend;
})
);
it('should create setup userinfo object ', function() {
httpMock.expectGET("/user/default/details").
respond({somejson});
ctrl = controllerService('UserCtrl', {$scope: ctrlScope, $location: location, User: _User, Config: _Config});
expect(_User.getUserInfo).toHaveBeenCalled();
httpMock.flush();
expect(ctrlScope.userinfo.length).toBe(1);
});
});
我得到的只是:
Error: No pending request to flush !
是否可以将httpBackend与您正在测试的控制器调用的服务一起使用?
答案 0 :(得分:1)
您是否有理由要专门测试GET请求?这是您的用户服务的实现细节。
无论你的函数是调用query()还是getUserInfo(),我怀疑你真正想知道的是你的用户服务调用了这个函数。由用户服务决定是否拥有自己的一组测试,以测试对/ user / defaults / details的GET请求。
这背后的原因是,当您更改用户服务的实现时,您不希望不相关的单元测试中断。当您的API更改为/user/query
时会发生什么?您的UserCtrl测试不应该中断,也不应该使用用户服务的任何其他控制器。如果您的UserCtrl在用户服务上调用getUserInfo(),那么就您而言,它正在做正确的事情。您的用户服务单元测试将中断,一旦您修复它们以指向您的新URL,一切都会恢复正常。