【发布时间】:2021-09-21 15:03:42
【问题描述】:
我使用Promise 和setTimeout 实现了一个非阻塞延迟,如下所示:
await new Promise((resolve) => setTimeout(resolve, 200))
我有一个调用这个延迟的函数:
const fn1 = async (v) => {
console.log(v)
}
const fn2 = async () => {
await fn1(1111111)
await new Promise((resolve) => setTimeout(resolve, 200))
await fn1(2222222)
}
然后我尝试使用 Sinon 中的 useFakeTimers 来模拟单元测试中的延迟 (Mocha):
const sinon = require('sinon')
describe('Test 1', () => {
it('Test 1.1', async () => {
const sb = sinon.createSandbox()
sb.useFakeTimers()
await fn2()
sb.clock.tick(500)
expect(1).to.equal(1)
sb.clock.restore()
})
})
我希望 sb.clock.tick(500) 模拟 500 毫秒的时间流逝,这样延迟承诺 (await new Promise((resolve) => setTimeout(resolve, 200))) 将得到解决,2222222 将被打印,并且测试将通过。
但是,我收到以下错误:
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
不知道我对useFakeTimers的理解有没有错……
【问题讨论】:
标签: javascript unit-testing promise mocking sinon