【问题标题】:stub setTimeout function存根 setTimeout 函数
【发布时间】:2020-03-10 12:29:39
【问题描述】:

我有一个函数等待

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

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

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

如何使用 Sinon 存根 setTimeout?

我试过了:

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

但是没有用。

【问题讨论】:

  • 你为什么要这样做?这是标准规定的功能。另外,这是 Javascript,您不需要模拟库来覆盖全局函数...
  • @JaredSmith 单元测试用例的执行延迟了 50 秒,因为我有 10 个用于该方法的单元测试用例。
  • 所以传递一个 0 的时间。它将在事件循环的下一个滴答声中触发。然后以 1 毫秒的延迟运行您的测试,而不是 4000 毫秒。
  • 但是从单元测试用例传递 0 不会影响实际的函数行为。
  • 你想得太多了。如果以 5 秒的延迟测试行为很重要,那么您将不得不为每个需要它的测试吃掉这 5 秒。如果不是,则传递一个零并完成它。如果您编写代码的方式无法做到这一点,请重写代码。说了这么多,globalThis.setTimeout = (cb) => cb();

标签: javascript node.js unit-testing sinon


【解决方案1】:

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

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

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

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

单元测试应该测试代码逻辑,而不是集成测试。所以,也许你只需要做一个断言检查 wait 函数是用参数调用的。够了。我们不需要在测试用例中等待 5000ms 的延迟。

  1. 如果你坚持要使用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)

【讨论】:

    猜你喜欢
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多