我有一些代码:
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/