我似乎无法在我的Jasmine测试中监视setTimeout和clearTimeout,这些测试正在通过Karma运行.
我尝试了所有这些的变化
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
在每种情况下,我都可以确认在runMyCode中已经调用了setTimeout和clearTimeout,但是我总是调用预期的spy setTimeout.
对于窗口,显然这是因为测试和跑步者(Karma窗口)在不同的帧中(所以为什么我应该期待任何不同的).但正因为如此,我无法确定是否有任何方法可以确认这些全局函数已被调用.
我知道我可以使用jasmine.clock()来确认已经调用了超时/间隔回调,但看起来我看不到setTimeout本身.并确认简单地调用clearTimeout是不可能的.
在这一点上,我唯一能想到的是添加一个单独的抽象层来包装setTimeout和clearTimeout或者将函数作为依赖项注入,我以前做过,但我觉得很奇怪.