Stencil 1.0.2是否中断了Jest计时器模拟?

时间:2019-06-13 15:44:55

标签: unit-testing jestjs stenciljs

我正在使用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 );
} );

测试应该通过,但是在最后一个Expect语句上失败

1 个答案:

答案 0 :(得分:1)

此行:

const result = ok( 1000 );

...将result设置为ok的返回值...

...但是ok不返回任何内容,因此result始终为undefined

因此第一个expect通过:

expect( result ).toBeUndefined();  // Success!

...但是第二个expect失败,因为result将始终为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!
});