Эта строка:
const result = ok( 1000 );
... устанавливает result
в возвращаемое значение ok
...
... но ok
не возвращаетсячто-нибудь, что result
всегда undefined
.
Итак, первый expect
проходит:
expect( result ).toBeUndefined(); // Success!
... но второй expect
терпит неудачу, поскольку result
всегда будетbe undefined
:
expect( result ).toBe( 3 ); // <= FAILS since result is always undefined
Проблема в том, что setTimeout
просто вызывает переданную ей функцию.
Если функция возвращает значение, то она просто теряется, поэтомуэта строка:
return 3;
... на самом деле ничего не делает.
Простой способ исправить тест состоит в том, чтобы ok
вернуть объект ...
... и передать функцию в setTimeout
установить свойство объекта следующим образом:
function ok(delay: number) {
const result: { val?: number } = {};
setTimeout(() => {
result.val = 3; // <= set a property on result
}, delay);
return result;
}
test('timer', () => {
jest.useFakeTimers();
const result = ok(1000);
jest.advanceTimersByTime(999);
expect(result.val).toBeUndefined(); // Success!
jest.runAllTimers();
expect(result.val).toBe(3); // Success!
});