Chai 兑现 promise documentation规定如下:
Notice: either return or notify(done) must be used with promise assertions.
网站上的示例如下:
return doSomethingAsync().should.eventually.equal("foo"); doSomethingAsync().should.eventually.equal("foo").notify(done);
事情是;实际上,我按照 promise 使用 chai 编写了一个测试,但没有返回 promise 。就像这样:
it('should resolve user', function () {
$state.get(state).resolve.user(dataservice, {
userId: testUser.id
}).should.eventually.eq(testUser);
$rootScope.$apply();
});
而且它工作得很好。我确信它确实如此,因为我将 testUser 更改为测试失败的其他内容。正如我所料。所以我不确定我在这里是否做错了什么。
事实上,当我修改代码以返回 promise 时,它失败并出现错误“错误:超出 2000 毫秒超时。确保在此测试中调用 did() 回调。”修改后的代码如下:
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 promise 。
最佳答案
在上面的例子中,Mocha 链在调用 $rootScope.$apply()
后返回了 Promise,因此链式 then
需要另一个 $rootScope.$apply( )
来执行。如果没有这个, promise 链的其余部分将不会被执行并导致超时。
Mocha 规范中的返回 Promise 旨在用于异步规范,这对于测试非 Angular Promise 是必要的。 $q
Promise 是同步的并且与 Angular 摘要相关。
如图here , chai-as-promised
可以修改为支持 $q
promise 并自动将 $rootScope.$apply()
应用于断言的 promise :
chaiAsPromised.transferPromiseness = function (assertion, promise) {
assertion.then = promise.then.bind(promise);
if (!('$$state' in promise))
return;
inject(function ($rootScope) {
if (!$rootScope.$$phase)
$rootScope.$digest();
});
};
关于javascript - 使用 Chai 作为 Promised 时,我真的需要在测试中返回 Promise 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37974675/