我正在使用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语句上失败
答案 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!
});