我似乎无法在通过 Karma 运行的 Jasmine 测试中监视 setTimeout
和 clearTimeout
。
我已经尝试了所有这些的变体
spyOn(window, 'setTimeout').and.callFake(()=>{});
spyOn(global, 'setTimeout').and.callFake(()=>{});
spyOn(window, 'clearTimeout').and.callThrough();
clock = jasmine.clock();
clock.install();
spyOn(clock, 'setTimeout').and.callThrough();
runMyCode();
expect(window.setTimeout).toHaveBeenCalled(); // no
expect(global.setTimeout).toHaveBeenCalled(); // nope
expect(window.clearTimeout).toHaveBeenCalled(); // no again
expect(clock.setTimeout).toHaveBeenCalled(); // and no
在每种情况下,我都可以确认 setTimeout
和 clearTimeout
已在 runMyCode
中调用,但我总是得到 Expected spy setTimeout 已被调用。
对于 window
,显然这是因为测试和运行程序(Karma 窗口)处于不同的框架中(所以我为什么要期待任何不同)。但正因为如此,我看不到任何方式来确认这些全局函数已被调用。
我知道我可以使用 jasmine.clock()
来确认超时/间隔回调已被调用,但看起来我无法观看 setTimeout
本身.并确认 clearTimeout
已被调用是不可能的。
在这一点上,我唯一能想到的就是添加一个单独的抽象层来包装 setTimeout
和 clearTimeout
或者将函数作为依赖项注入(inject),这我以前做过,但我觉得很奇怪。
最佳答案
我能够让它像这样工作:
spyOn(window, 'setTimeout');
runMyCode();
expect(setTimeout).toHaveBeenCalled();
只需从 setTimeout 调用中删除“窗口”对象即可。
关于javascript - 监视 Karma 和 Jasmine 中的 setTimeout 和 clearTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35080280/