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’对象即可.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...