我正在尝试对我的一条路线进行单元测试,并且我得到了臭名昭着的“错误:意外请求”错误。我的路线采用“resolve”参数,如下所示:
when('/Users',
{
templateUrl: 'app/users/user-list.tpl.html',
controller: 'UserListCtrl',
resolve: {
userAccounts: ['UserAccounts', function(UserAccounts) {
return UserAccounts.query({ id: 123 });
}]
}
})
其中 UserAccounts 是“资源”。我正在测试我的路线如下:
beforeEach(inject(function (_$route_, _$location_, _$rootScope_, _$httpBackend_) {
$route = _$route_;
$location = _$location_;
$rootScope = _$rootScope_;
$httpBackend = _$httpBackend_;
$httpBackend.when('GET', 'api/Accounts/123/UserAccounts').respond([]);
$httpBackend.when('GET', 'app/users/user-list.tpl.html').respond({});
}));
it('/Users should get user-list template and use UserListCtrl', inject(function($controller) {
$httpBackend.expectGET('app/users/user-list.tpl.html');
$httpBackend.expectGET('api/Accounts/123/UserAccounts');
expect($route.current).toBeUndefined();
$location.path('/Users');
$rootScope.$digest();
expect($route.current.loadedTemplateUrl).toBe('app/users/user-list.tpl.html');
expect($route.current.controller).toBe('UserListCtrl');
}));
测试失败,Error: Unexpected request: GET http://myserver/api/Accounts/123/UserAccounts
。这是我的决心所要求的。有什么想法,正确的方法是测试这样的路线?
答案 0 :(得分:3)
关于测试代码,有两件事情看起来很奇怪。
首先,您的beforeEach方法的GET请求与实际测试中调用的请求重复。尝试删除它们。
其次,在你的最终断言之前,你似乎错过了对$ httpBacken.flush()的调用。
希望这有帮助。
答案 1 :(得分:3)
您可以尝试模拟服务
beforeEach(module(function($provide) {
$provide.value('UserAccounts', {
query: angular.noop
});
}));
如果您关心是否已调用服务方法,则可以创建间谍。
beforeEach(function() {
spyOn(UserAccounts, 'query');
});
答案 2 :(得分:2)
哇!这是一个愚蠢的。我在资源
中定义了完整的URLhttp://myserver/api/Accounts/:accountId/UserAccounts/:userId
我正在$httpBackend
设定期望来检查相对路径。
api/Accounts/123/UserAccounts
答案 3 :(得分:0)
单元测试路线的已解决值:
var resolvedUserAccounts = $ injector.invoke($ route.current。$$ route.resolve.userAccounts);