这是我的测试:
it('add.user() should POST to /users/, failure', function() {
mockBackend.expectPOST("https://stackoverflow.com/users/", {username:'u', password: 'p', email: 'e', location: 'loc'}).respond(400, {msg: "bad request"});
BaseService.add.user({username:'u', password: 'p', email: 'e', location: 'loc'});
mockBackend.flush();
});
afterEach(function() {
mockBackend.verifyNoOutstandingExpectation();
mockBackend.verifyNoOutstandingRequest();
});
当我运行这个测试,我得到这个错误:
Chromium 53.0.2785 (Ubuntu 0.0.0) Factory: BaseService add.user() should POST to /users/, failure FAILED
[object Object] thrown
Error: [$rootScope:inprog] $digest already in progress
http://errors.angularjs.org/1.3.15/$rootScope/inprog?p0=%24digest
at /home/user/Documents/ebdjango/ebdjangoapp/static/js/angular.js:63:12
at beginPhase (/home/user/Documents/ebdjango/ebdjangoapp/static/js/angular.js:14820:15)
at Scope.$digest (/home/user/Documents/ebdjango/ebdjangoapp/static/js/angular.js:14262:9)
at Function.$httpBackend.verifyNoOutstandingExpectation (node_modules/angular-mocks/angular-mocks.js:1557:38)
at Object.<anonymous> (tests/test_base.js:61:21)
这是BaseService.add.user()
:
self.add = {
user: function(user) {
return $http.post("https://stackoverflow.com/users/", user)
.then(function successHandler(response) {
return $http.post("/custom-api-auth/login", user)
}).then(function successHandler(response) {
$window.location.href = "/";
// if there are errors, rewrite the error messages
}).catch(function rejectHandler(errorResponse) {
for (prop in errorResponse.data) {
if (prop == "email") {
errorResponse.data[prop] = "Please enter a valid email address.";
} else if (prop == "username") {
errorResponse.data[prop] = "Username can only contain alphanumeric characters and '.'";
} else if (prop == "password") {
errorResponse.data[prop] = "Please enter a valid password";
}
}
throw errorResponse;
};
如何防止$digest already in progress
错误的发生?
编辑:如果我删除throw errorResponse;
,测试工作,但我需要throw errorResponse;
那里,因为我需要显示在前端的错误(这另一个控制器需要照顾.. BaseService.add.user().catch()
基本上重写应该在显示的错误前端)。
编辑2:当错误消息指出at Object.<anonymous> (tests/test_base.js:61:21)
它指向的行:mockBackend.verifyNoOutstandingExpectation();
错误消息被截断。请始终发布它们。发布的代码中没有任何内容会导致这种情况。该测试很可能与其他单位不够隔离。如果应用程序中存在路由器,则应将其存起来。顺便说一句,$ window.location本身是不好的,它会搞砸下一个测试,其中一个响应不会返回错误。 – estus
@estus我编辑的职位,以显示完整的错误消息。另外,如果不是'$ window.location'来设置URL,我应该使用什么呢?(在测试时,我想将URL设置为任何特定的URL,并验证URL在POST成功后更改。在实际应用程序中 - 未测试时 - 我使用$ window.location将用户重定向到不同的URL ) – user2719875
你可以分享你的'mockBackend'吗? – tanmay