javascript - 为什么这个 Jasmine spy 会导致错误?

标签 javascript jasmine

我有一些代码:

var bar = function() { ... };
var foo = function() { bar(); };

还有 Jasmine 测试:

describe('foo', function() {
    it('calls bar', function() {
        spyOn(window, 'foo'); // this line causes an error
        spyOn(window, 'bar');
        foo();
        expect(bar).toHaveBeenCalled();
    });
});

注释行导致此错误:

预期 spy 栏已被调用。

Jasmine 监视 foo 是否会以某种方式杀死其 native 实现?如果我删除注释行,测试就会通过。

最佳答案

此特定测试的目的是检查 foo() 的调用是否会导致 bar() 的调用。为此,...

it('calls bar', function() {
  spyOn(window, 'bar');
  foo();
  expect(bar).toHaveBeenCalled();
});

...就足够了。是的,您必须模拟 bar 函数,因此它不会执行其工作,而只会报告其调用。但无论如何,您都不应该使用 spyOn 来模拟 foo - 您正在测试函数,而不是模拟!

如果出于某种原因,您应该观察它,请使用 andCallThrough spy 方法:

it('calls bar', function() {
  spyOn(window, 'foo').andCallThrough();
  spyOn(window, 'bar');
  foo();
  expect(bar).toHaveBeenCalled();
});

这样,模拟仍然会被创建(因此您可以使用它的一些方法 - 例如,检查函数被调用的次数);区别在于在模拟工作结束时调用原始函数 foo 。

关于javascript - 为什么这个 Jasmine spy 会导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18925446/

相关文章:

javascript - JS : How to make the val() real-time

JavaScript,根据光标位置将字符串添加到文本区域

javascript - Watson Conversation - Oracle 数据库集成

javascript - 如何为包含 HTML 和 JavaScript 或 jQuery 的网页编写 Jasmine 测试?

javascript - 模块 'httpMock' 不可用

angularjs - 如何在 Jasmine/Protractor 中模拟 angular.module ('myModule',[]).value()

javascript - ionic 应用程序无法识别 Android 手机中的语音

javascript - 是否可以在页面最后加载 javascript 广告以防止加载时间变慢?

javascript - 使用 Jasmine 测试嵌套的 promise

javascript - Jasmine 中 NUnit 的 TestCaseSource 是否有相应的设置?