gpt4 book ai didi

node.js - 如何使用 Jest 模拟异步函数延迟时间

转载 作者:行者123 更新时间:2023-12-05 05:33:59 27 4
gpt4 key购买 nike

我正在尝试使用 Jest 在 nodeJS 中为一个函数编写一个测试,该函数一个接一个地调用两个异步函数。我想延迟 funcA,期望 funcB 不会被调用,然后运行计时器并期望 funcB 被调用。

代码看起来像这样

//module1.js
async function mainFunc() {
await module2.funcA()
await module2.funcB()
}



//module2.js
async function funcA(){
// making some async operation
}

async function funcB(){
// making some async operation
}

我试过像这样模拟 funcA 的实现:

const spyOnFuncA = jest.spyOn(module2, 'funcA').mockImplementation(async () => new Promise((r) => setTimeout(r, 1000)))

然后在测试中做这样的事情:

  test('Should not call second function until first function resolved', async () => {
jest.useFakeTimers()
const spyOnFuncA = jest.spyOn(module2, 'funcA').mockImplementation(async () => new Promise((r) => setTimeout(r, 1000)))
const spyOnFuncB = jest.spyOn(module2, 'funcB').mockImplementation()

mainFunc()
expect(spyOnFuncA).toBeCalled()
expect(spyOnFuncB).not.toBeCalled()

jest.runAllTimers()
expect(spyOnFuncB).toBeCalled()

})

我认为这里的问题是 jest.useFakeTimers 与 mockImplementation 中的 setTimeout 相矛盾

我应该如何测试这个?

不胜感激

干杯!

最佳答案

模拟 funcA 返回 deferred promise ,稍后解决。我知道 sinon 提供了一个 promise helper为了涵盖 deferred,所以 jest 可能包含类似的结构。否则这里是 simple implementations 之一从那个答案:

class Deferred {
constructor() {
this.promise = new Promise((resolve, reject) => {
this.reject = reject
this.resolve = resolve
})
}
}

然后模拟是这样的:

    const deferred = new Deferred()
const spyOnFuncA = jest.spyOn(module2, 'funcA').mockImplementation(() => deferred.promise)
mainFunc() // avoid uncaught exceptions with `.catch`
.catch(err => expect(err).toBe(null))
expect(spyOnFuncA).toBeCalled()
expect(spyOnFuncB).not.toBeCalled()
await deferred.resolve('whatever')
expect(spyOnFuncB).toBeCalled()

关于node.js - 如何使用 Jest 模拟异步函数延迟时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73707110/

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