我有一些代码:
var bar = function() { ... };
var foo = function() { bar(); };
茉莉花测试:
describe('foo', function() {
it('calls bar', function() {
spyOn(window, 'foo'); // this line causes an error
spyOn(window, 'bar');
foo();
expect(bar).toHaveBeenCalled();
});
});
注释行会导致此错误:
Expected spy bar to have been called.
Jasmine监视foo
是否会以某种方式杀死其原生实现?如果我删除了注释行,则测试通过。
答案 0 :(得分:5)
此特定测试的目的是检查foo()
的调用是否导致bar()
的调用。出于此目的,......
it('calls bar', function() {
spyOn(window, 'bar');
foo();
expect(bar).toHaveBeenCalled();
});
......就足够了。是的,您必须模拟bar
功能,因此它不会完成其工作,而只是报告其呼叫。但是你绝不应该用foo
模仿spyOn
- 你测试这个函数,而不是模拟!
如果由于某种原因你应该观察它,请使用andCallThrough
间谍方法:
it('calls bar', function() {
spyOn(window, 'foo').andCallThrough();
spyOn(window, 'bar');
foo();
expect(bar).toHaveBeenCalled();
});
这样仍然可以创建模拟(所以你可以使用它的一些方法 - 例如检查函数的调用次数);不同之处在于在模拟工作结束时调用原始函数foo
。
答案 1 :(得分:0)
spyOn(window, 'foo').andCallThrough()