【发布时间】:2020-08-11 06:56:35
【问题描述】:
下面是我想要实现的一个最小示例:我想测试 fn3() 是否被调用,如果异步函数 fn2() 已解决(当调用 fn1 时)。但是我不知何故未能使用sinon 的存根语法做到这一点。我想知道我误解了什么。
// System Under Test
export function fn1() {
fn2().then(() => {
fn3();
});
}
export async function fn2() {
return new Promise((resolve, reject) => {
// expensive work
resolve();
});
}
export function fn3() {
console.log("fn3");
}
// Test
import * as Page from "xxx";
it("test async", () => {
// stub this async to isolate the SUT
sinon.stub(Page, "fn2").resolves();
const stub = sinon.stub(Page, "fn3");
Page.fn1();
sinon.assert.calledOnce(stub);
});
/*
AssertError: expected fn3 to be called once but was called 0 times
276 | Page.fn1();
277 |
> 278 | sinon.assert.calledOnce(stub);
| ^
279 | });
280 | });
at Object.fail (node_modules/sinon/lib/sinon/assert.js:107:21)
at failAssertion (node_modules/sinon/lib/sinon/assert.js:66:16)
at Object.calledOnce (node_modules/sinon/lib/sinon/assert.js:92:13)
at Object.<anonymous> (src/test.test.tsx:278:22)
*/
【问题讨论】:
-
你在存根上断言 before 可能已经执行了 promise 回调。
-
你的意思是当程序在
fn1()里面遇到async函数时,它会在main函数中fork并继续进行断言,因此它在promise执行之前就断言了?跨度> -
有点,我不会将其描述为“分叉”,但承诺回调被添加到任务队列中,不立即执行,而断言在立即执行的调用堆栈。
-
感谢您的解释!我想我可以想出一个解决方案。
标签: javascript node.js asynchronous sinon