javascript - 监视 Karma 和 Jasmine 中的 setTimeout 和 clearTimeout

标签 javascript unit-testing jasmine karma-jasmine

我似乎无法在通过 Karma 运行的 Jasmine 测试中监视 setTimeoutclearTimeout

我已经尝试了所有这些的变体

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

在每种情况下,我都可以确认 setTimeoutclearTimeout 已在 runMyCode 中调用,但我总是得到 Expected spy setTimeout 已被调用。

对于 window,显然这是因为测试和运行程序(Karma 窗口)处于不同的框架中(所以我为什么要期待任何不同)。但正因为如此,我看不到任何方式来确认这些全局函数已被调用。

我知道我可以使用 jasmine.clock() 来确认超时/间隔回调已被调用,但看起来我无法观看 setTimeout 本身.并确认 clearTimeout 已被调用是不可能的。

在这一点上,我唯一能想到的就是添加一个单独的抽象层来包装 setTimeoutclearTimeout 或者将函数作为依赖项注入(inject),这我以前做过,但我觉得很奇怪。

最佳答案

我能够让它像这样工作:

spyOn(window, 'setTimeout');
runMyCode();
expect(setTimeout).toHaveBeenCalled();

只需从 setTimeout 调用中删除“窗口”对象即可。

关于javascript - 监视 Karma 和 Jasmine 中的 setTimeout 和 clearTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35080280/

相关文章:

javascript - 满足 promise 时运行 frisby 测试

javascript - 将 ajax 调用中的 html 附加到影子 DOM

javascript - 如何使用 mocha sinon 模拟类异步/等待函数

javascript - 在单元测试中模拟 Angular 2 组件依赖

c# - 为什么我在 MSpec 中得到 get_ConsoleOut() 的 MissingMethodException?

TypeScript 找不到名称 'describe'

javascript - Jasmine Node 说 "0 tests"当有*有*测试

javascript - jQuery:如何 .show() 具有包含特定文本的类的元素?

javascript - Vue.js 过滤列表

javascript - 节点 8.10.0 错误 “Octal literals are not allowed in strict mode”