【发布时间】:2017-08-27 00:26:26
【问题描述】:
这是我的测试:
it('add.user() should POST to /users/, failure', function() {
mockBackend.expectPOST("/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("/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 我编辑了帖子以显示完整的错误消息。另外,如果不是
$window.location,我应该使用什么来设置URL? (测试时,我想将 URL 设置为任何特定的 URL,并验证成功 POST 后 URL 是否更改。在实际应用程序中 - 未测试时 - 我使用$window.location将用户重定向到不同的 URL)跨度> -
你能分享你的
mockBackend吗?
标签: angularjs jasmine karma-runner karma-jasmine angular-mock