javascript – 窥探Karma和Jasmine中的setTimeout和clearTimeout

前端之家收集整理的这篇文章主要介绍了javascript – 窥探Karma和Jasmine中的setTimeout和clearTimeout前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我似乎无法在我的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或者将函数作为依赖项注入,我以前做过,但我觉得很奇怪.

解决方法

我能够让它像这样工作:
spyOn(window,'setTimeout');
runMyCode();
expect(setTimeout).toHaveBeenCalled();

只需从setTimeout调用删除’window’对象即可.

原文链接:https://www.f2er.com/js/156603.html

猜你在找的JavaScript相关文章