gpt4 book ai didi

javascript - 当按照 promise 使用 Chai 时,我真的需要在测试中返回 promise 吗?

转载 作者:行者123 更新时间:2023-11-29 21:24:04 25 4
gpt4 key购买 nike

Chai 如约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 毫秒的超时。确保在此测试中调用了 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 promise。

最佳答案

在上面的例子中,Mocha 链在 $rootScope.$apply() 被调用后返回了 promise,因此链式 then 需要另一个 $rootScope.$apply( ) 被执行。否则, promise 链的其余部分将不会执行并导致超时。

Mocha 规范中的返回 promise 适用于异步规范,这对于测试非 Angular promise 是必要的。 $q promises 是同步的并与 Angular 摘要相关联。

如图here , chai-as-promised 可以修改以支持 $q promises 并自动将 $rootScope.$apply() 应用到 asserted promises:

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 - 当按照 promise 使用 Chai 时,我真的需要在测试中返回 promise 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37974675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com