javascript - stub setTimeout 函数

标签 javascript node.js unit-testing sinon

我有一个函数等待

async function wait(time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}

我这样称呼这个等待:来自不同函数的await wait(5000);

我正在编写单元测试用例,它总是执行等待,每个测试用例等待5秒。

如何使用 Sinon 对 setTimeout 进行 stub ?

我尝试过:

  // Skip setTimeOut
  clock = sinon.useFakeTimers({
    now: Date.now(),
    toFake: ['setTimeout']
  });
  await clock.tickAsync(4000);
  await Promise.resolve();

但是没有成功。

最佳答案

相关帖子:setTimeout not triggered while using Sinon's fake timers

Github问题:https://github.com/sinonjs/fake-timers/issues/194#issuecomment-395224370

您可以通过两种方式解决这个问题。

  1. 考虑您的测试用例是否需要 5000 毫秒的延迟。

单元测试应该测试代码逻辑,而不是集成测试。因此,也许您只需要进行断言检查将使用参数调用 wait 函数。够了。测试用例中我们不需要等待5000ms的延迟。

  • 如果您坚持要使用sinon.useFakeTimers()clock.tick(5000)
  • 从相关帖子中,我们可以这样做:

    index.ts:

    async function wait(time: number, clock?) {
      return new Promise((resolve) => {
        setTimeout(resolve, time);
        clock && clock.tick(time);
      });
    }
    
    export async function main(time, /* for testing */ clock?) {
      await wait(time, clock);
      console.log('main');
    }
    

    index.test.ts:

    import { main } from './';
    import sinon, { SinonFakeTimers } from 'sinon';
    
    describe('60617715', () => {
      let clock: SinonFakeTimers;
      beforeEach(() => {
        clock = sinon.useFakeTimers();
      });
      afterEach(() => {
        clock.restore();
      });
      it('should pass', async () => {
        await main(5000, clock);
      });
    });
    

    单元测试结果:

      60617715
    main
        ✓ should pass
    
    
      1 passing (9ms)
    

    关于javascript - stub setTimeout 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60617715/

    相关文章:

    javascript - jsplumb 拖放连接会转到错误的元素

    javascript - 我可以在 async.js forEach 中扩展迭代器函数吗?

    python - 如何在所有应用程序函数中模拟 Django 的 now 函数

    php - Selenium 浏览器窗口大小

    javascript - Jest spyOn 函数调用

    c# - 如何对 <HEAD> 部分中的文件进行版本控制?

    node.js - 使用 DTO 从访问 token 附加用户 ID

    node.js - 如何更改请求 header 限制

    c# - 如何模拟多个级别的 DbSet.Include lambda?

    javascript - 根据该对象中其他两个属性的值获取 Javascript 对象属性的值