【发布时间】:2016-10-24 18:54:10
【问题描述】:
Chai as Promised documentation 声明如下:
注意:return 或 notify(done) 必须与 promise 断言一起使用。
网站上的例子如下:
return doSomethingAsync().should.eventually.equal("foo"); doSomethingAsync().should.eventually.equal("foo").notify(done);
问题是;实际上,我按照承诺使用 chai 编写了一个测试,但没有返回承诺。像这样:
it('should resolve user', function () {
$state.get(state).resolve.user(dataservice, {
userId: testUser.id
}).should.eventually.eq(testUser);
$rootScope.$apply();
});
而且效果很好。我确信它确实如此,因为我将 testUser 更改为测试失败的其他东西。正如我所料。所以我不确定我是否在这里做错了。
事实上,当我修改代码以返回一个承诺时,它失败并出现错误“错误:超过 2000 毫秒的超时。确保在此测试中调用了 done() 回调。”修改后的代码如下:
it('should resolve user', function () {
var promise = $state.get(state).resolve.user(dataservice, {
userId: testUser.id
}).should.eventually.eq(testUser);
$rootScope.$apply();
return promise;
});
这里有点混乱。它可能与 Angular $q 有关。为了清楚起见,resolve.user 函数返回一个 $q 承诺。
【问题讨论】:
-
不,你不应该。见this。
-
user(dataService, { ... })是否同步工作? (即它会立即返回吗?) -
@AtesGoral 它异步工作。
-
@estus:在您提供的链接中,您说“$q promises can be duck-typed by $$state property”。但我没有明确地这样做。那么,Chai 正如所承诺的那样,现在隐含地做到了吗?
-
是的。如果没有这个 hack,你需要使用
$rootScope.$apply()手动启动 $q 链。
标签: javascript angularjs angular-promise chai chai-as-promised