gpt4 book ai didi

javascript - 我如何断言一个函数有 `await` 使用 should.js 编辑了一个异步函数

转载 作者:行者123 更新时间:2023-11-30 06:20:21 25 4
gpt4 key购买 nike

我有一个调用另一个异步函数 g 的异步函数 f。为了测试 f 是否调用了 g,我使用 sinon 对 g 进行了 stub ,并断言它是使用 should.js 调用的。

'use strict';

require('should-sinon');
const sinon = require('sinon');

class X {
async f(n) {
await this.g(n);
// this.g(n); // I forget to insert `await`!
}
async g(n) {
// Do something asynchronously
}
}

describe('f', () => {
it('should call g', async () => {
const x = new X();
sinon.stub(x, 'g').resolves();
await x.f(10);
x.g.should.be.calledWith(10);
});
});

但是即使我在 f 中调用 g 时忘记使用 await,这个测试也通过了。

捕获此错误的方法之一是让 stub 返回一个虚拟 promise 并检查它的 then 是否被调用。

it('should call g', async () => {
const x = new X();
const dummyPromise = {
then: sinon.stub().yields()
};
sinon.stub(x, 'g').returns(dummyPromise);
await x.f(10);
x.g.should.be.calledWith(10);
dummyPromise.then.should.be.called();
});

但这有点麻烦。有什么方便的方法吗?

最佳答案

f 的示例显示有缺陷的代码设计,如果您在不使用 async/await 的情况下编写相同的函数,这一点会变得更加明显语法:


f(n) {
return g(n).then(()=>{});
}

这实现了相同的行为——无论是g resolved 变得很难说(假设你不知道 f 是否返回了 g 的 promise ,这与不知道 f 是否等待了 g 是一样的)。如果fg 的结果不感兴趣它应该只是返回它,而不是隐藏它。然后你可以简单地测试结果。

如果你的意思是f可能必须触发多个 async按顺序调用 await ing 几个 g_1 , g_2 ,... 来解决,那么你可以通过在 g_n+1 的 stub 中断言来构建测试链g_n 的虚拟 promise 已经解决了。一般来说,您测试虚拟 promise 状态的方法很好。

关于javascript - 我如何断言一个函数有 `await` 使用 should.js 编辑了一个异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53529435/

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