我在角度控制器中有一些代码:
user是一个angular $资源,它在调用get方法时返回一个promise。
$scope.credentials = {
username:"",
password:"",
rememberMe:false
};
var currentUser = {};
$scope.login = function(callback){
user.get($scope.credentials)
.$promise
.then(function(user){
$scope.currentUser = user;
return cb ? cb(user) : user;
})
.catch(function(res){
throw "LoginError";
});
};
我试图测试它是否会像茉莉一样抛出错误:
expect(function(){
scope.login();
}).toThrow();
但是抛出了这个错误:
抛出异常的预期函数。
我已经测试了承诺的接受程度,它按预期工作,但我假设有一些我无法处理的异步方面。
我也试过调用传入并调用done(),但这也没有用。
编辑:
我这样嘲笑我的后端:
beforeEach(inject(function($rootScope,$controller,_$httpBackend_){
$httpBackend = _$httpBackend_;
successCallback = jasmine.createSpy();
errorCallback = jasmine.createSpy();
scope = $rootScope.$new();
controller = $controller('LoginController',{
'$scope':scope
});
}));
afterEach(function(){
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
请注意,我的其他测试确实有效,我尝试了服务器返回200的其他场景和用户,一切正常。我专门测试$ scope.login()在收到服务器错误时是否抛出错误。
答案 0 :(得分:6)
您需要设置$ httpBackend来模拟资源的响应。 然后,您需要刷新这些结果,以便控制它们何时解决。
我在plunker上为你准备了一个简短的场景示例。
http://plnkr.co/edit/lnWaS1lyJja56Zh1STyl?p=preview
相关的spec文件。 http://embed.plnkr.co/lnWaS1lyJja56Zh1STyl/appSpec.js
摘录一览:
$httpBackend.expectGET('/api/index.php/user')
.respond(500, 'error');
//Initiate request by calling your api/resource
$httpBackend.flush();