作为承诺文档的 Chai 声明如下:
注意 :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承诺。
在上述情况下,摩卡链$rootScope.$apply()被调用后返回了保证,因此链式then需要另一个$rootScope.$apply()执行。没有这个,承诺链的其余部分将不会执行,并导致超时。
$rootScope.$apply()
then
Mocha规范中的返回承诺旨在用于异步规范,这对于测试非角度承诺是必需的。$q承诺是同步的,并且与Angular摘要相关。
$q
如图所示这里,chai-as-promised可以进行修改,以支持$q承诺,并申请$rootScope.$apply()自动断言承诺:
chai-as-promised
chaiAsPromised.transferPromiseness = function (assertion, promise) { assertion.then = promise.then.bind(promise); if (!('$$state' in promise)) return; inject(function ($rootScope) { if (!$rootScope.$$phase) $rootScope.$digest(); }); };