我试图为我的角服务编写一个单元测试,下面是服务中的一个函数:
login = function(authObject) {
deferred = $q.defer();
$http({
url: '/api/v1/session/create',
method: 'POST',
data: authObject
}).success(function(response) {
var user;
if (response.status === 'ok' && response.user && response.authenticated === true) {
user = response.user;
}
return deferred.resolve(response);
}).error(function(data) {
deferred.reject(data);
return $state.go('api_error');
});
return deferred.promise;
};我可以通过这样的方法成功地测试success案例:
it('should go to the api error state', function() {
var authObject;
authObject = {
username: 'a@b.com',
password: 'c'
};
$httpBackend.expectPOST('/api/v1/session/create').respond(someData);
userService.login(authObject).then(function(response) {
return console.log("not error", response);
}, function(response) {
return console.log("error", response);
});
return expect($state.go).toHaveBeenCalledWith('api_error');
});但是,如果我这样做了:$httpBackend.expectPOST('/api/v1/session/create').respond(500, 'error');,那么错误大小写就不会被调用。我做错了什么?
发布于 2014-06-27 21:19:47
为了调用.then()错误回调,链中的先前承诺应该导致错误(例如抛出异常)或被拒绝。
返回500将导致调用login()方法中的error回调,但由于该回调既不会引发错误,也不会被拒绝,因此将不会调用链接的错误回调。
例如改变:
}).error(function(data) {
deferred.reject(data);
return $state.go('api_error');
});至:
}).error(function(data) {
return deferred.reject(data);
//return $state.go('api_error');
});会起作用的(但它不能做你想做的事:D)。
我不太熟悉ui-router,但在这种情况下,$state.go()可能会中止当前的执行链,因此我不确定以下操作是否有效:
}).error(function(data) {
$state.go('api_error');
return deferred.reject(data);
});https://stackoverflow.com/questions/24460071
复制相似问题