微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/js/156603.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐