【问题标题】:Sinon useFakeTimers mocking delay promise times out诗乃 useFakeTimers 嘲笑延迟承诺超时
【发布时间】:2021-09-21 15:03:42
【问题描述】:

我使用PromisesetTimeout 实现了一个非阻塞延迟,如下所示:

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


    【解决方案1】:

    看来这个问题的正确解决方案是使用clock.tickAsync。 我稍微更新了目标函数,使其更易于测试:

    const fn = async (callback) => {
      await callback(1111111)
    
      await new Promise((resolve) => setTimeout(resolve, 200))
    
      await callback(2222222)
    }
    

    工作测试如下:

    describe('Test 1', () => {
      let sb
    
      beforeEach(() => {
        sb = sinon.createSandbox()
    
        sb.useFakeTimers()
      })
    
      afterEach(() => {
        sb.clock.restore()
      })
    
      it('Test 1.1', async () => {
        const callbackSpy = sinon.spy()
    
        fn(callbackSpy)
    
        expect(callbackSpy.callCount).to.equal(1)
    
        await sb.clock.tickAsync(210)
    
        expect(callbackSpy.callCount).to.equal(2)
        expect(callbackSpy.calledWith(1111111)).to.equal(true)
        expect(callbackSpy.calledWith(2222222)).to.equal(true)
      })
    })
    

    问题是clock.tickAsync 仅在sinon 的更高版本中可用。 对于一些早期版本(例如2.4),clock.tickAsync 不存在,我还没有弄清楚如何测试上面的案例。

    【讨论】:

      猜你喜欢
      • 2019-07-07
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 2015-03-27
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多