функция-заглушка setTimeout - PullRequest
0 голосов
/ 10 марта 2020

У меня есть функция wait

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

И я вызываю это ожидание так: await wait(5000); из другой функции.

Я пишу тестовые примеры, и всегда выполняется ожидание и каждый тестовый случай ждет 5 с.

Как мне заглушить setTimeout с помощью Sinon?

Я попробовал:

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

Но это не сработало.

1 Ответ

1 голос
/ 11 марта 2020

Связанный пост: setTimeout не срабатывает при использовании фальшивых таймеров Синона

Проблема с Github: https://github.com/sinonjs/fake-timers/issues/194#issuecomment -395224370

Вы можете решить эту проблему двумя способами.

  1. Подумайте, требует ли ваш тестовый случай задержки 5000 мс.

В модульном тесте должен проверяться код logi c, это не интеграционные тесты. Так что, может быть, вам просто нужно проверить утверждение, что функция wait должна вызываться с параметром. Достаточно. Нам не нужно ждать задержки 5000 мс в тестовом случае.

Если вы настаиваете, хотите использовать 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)
...