#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:
- Я делал
spyOn(...
вместоjest.spyOn(...
- Я изменил объект, за которым я следил
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