Не нарушены ли макеты Jest timer в Stencil 1.0.2? - PullRequest
0 голосов
/ 13 июня 2019

Я использую StencilJS v1.0.2, и он запускает модульные тесты в Jest. У меня есть следующий код, но он не работает, как ожидалось. Я правильно использую API?

function ok( delay: number ) {
  setTimeout(() => {
    return 3;
  }, delay);
}

test( 'timer', () => {
  jest.useFakeTimers();
  const result = ok( 1000 );
  jest.advanceTimersByTime( 999 );
  expect( result ).toBeUndefined();
  jest.runAllTimers();
  expect( result ).toBe( 3 );
} );

тест должен пройти, но вместо этого он проваливается при последнем ожидании

1 Ответ

1 голос
/ 15 июня 2019

Эта строка:

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!
});
...