如何在玩笑测试中延迟模拟ReturnValue?
此测试的目的是模拟方法在flushpromise上未解决。比方说,
有两种可能的方法,我们可以通过
实现这一点上述两个选项预计都会在断言时给出未解决的承诺。
尽管如此,第二个选项似乎不适用于以下代码。任何意见都将受到赞赏。
尝试了以下代码。
`
import callout from ".../callout.."
jest.mock(
"../callout..",
()=>{
return{
default:jest.fn(),
};
},
{virtual: true}
);
const { setImmediate } = require("timers");
function flushPromises()
{
return new Promise((resolve)=> setImmediate(resolve));
}
`it("test delay", async()=>{
jest.useFakeTimers();
callout.mockResolvedValue(()=> Promise(resolve=>setTimeout(()=>resolve(),2000)));
jest.advanceTimersByTime(20);
await flushpromises();
expect(callout).not.toHavebeencalled();
jest.advanceTimersByTime(2000);
expect(callout).toHavebeencalled();
});
`
我可以通过以下更改解决问题。
基本上,我用
setTimeout
自定义函数替换了 wait
,如下所示。
import callout from ".../callout..";
jest.mock(
"../callout..",
() => {
return {
default: jest.fn(),
};
},
{ virtual: true }
);
const { setImmediate } = require("timers");
function flushPromises() {
return new Promise((resolve) => setImmediate(resolve));
}
function wait(ms, value) {
return new Promise((resolve) => setTimeout(resolve, ms, value));
}
it("test delay", async () => {
jest.useFakeTimers();
let response = JSON.stringify({ status: 200, data: true });
callout.mockReturnValueOnce(wait(2000, response));
jest.advanceTimersByTime(20);
await flushpromises();
expect(callout).not.toHavebeencalled();
jest.advanceTimersByTime(2000);
expect(callout).toHavebeencalled();
});