Проверка аргумента millisecods при setTimeout с помощью jest

#javascript #jestjs #mocking #settimeout #spy

#javascript #jestjs #издевательство #settimeout #шпион

Вопрос:

У меня есть способ вызвать паузу, используя обещание с setTimeout:

 pause = ({ time } = {}) => {
  const pauseTime = time || 500;

  return new Promise((resolve) => {
    setTimeout(() => {
      resolve()
    }, pauseTime)
  })
}
 

Я хочу протестировать его с помощью jest, ожидая, что функция timeout получит аргумент time, который получает метод pause.

 jest.useFakeTimers();

const setTimeoutSpy = spyOn(window, 'setTimeout')
const pausePromise = pause({ time: 2500 })


await jest.runAllTimers();

pausePromise.then(() => {
  expect(setTimeoutSpy).toHaveBeenCalledTimes(1);
  expect(setTimeoutSpy).toHaveBeenCalledWith(2500);
})

jest.useRealTimers();
return pausePromise
 

Я пробовал с mocks и spies. Также пробовал без таймеров и ожидал обещания. Но я всегда получаю один и тот же результат: ожидаемый spy был вызван один раз, но он был вызван ноль раз.

Есть идеи?

Спасибо!

Комментарии:

1. Вы шпионите за setTimeout после того, как вызвали тестируемый метод. Вам нужно сделать это заранее.

2. Вы правы. Я переместил шпиона перед методом, но все еще не работает.

Ответ №1:

Наконец-то я нашел проблему. Это была проблема с реализацией spy:

  1. Я делал spyOn(... вместо jest.spyOn(...
  2. Я изменил объект, за которым я следил window , на global

Спасибо всем за ваши комментарии!

Ответ №2:

Это работает для jest: ^24.9.0 .

Например.

index.ts :

 export const pause = ({ time } = {} as any) => {
  const pauseTime = time || 500;

  return new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, pauseTime);
  });
};
 

index.test.ts :

 import { pause } from './';

jest.useFakeTimers();

describe('65135435', () => {
  it('should pass', async () => {
    const setTimeoutSpy = jest.spyOn(window, 'setTimeout');
    const pausePromise = pause({ time: 2500 });

    jest.runAllTimers();

    await pausePromise;
    expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 2500);
    expect(setTimeoutSpy).toHaveBeenCalledTimes(1);
  });
});
 

результат модульного теста:

  PASS  src/stackoverflow/65135435/index.test.ts
  65135435
    ✓ should pass (6ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |    33.33 |      100 |      100 |                   |
 index.ts |      100 |    33.33 |      100 |      100 |               1,2 |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        4.119s