为什么这个Jasmine间谍会导致错误?

gwg*_*gwg 2 javascript jasmine

我有一些代码:

var bar = function() { ... };
var foo = function() { bar(); };
Run Code Online (Sandbox Code Playgroud)

并进行茉莉花测试:

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

注释行导致此错误:

Expected spy bar to have been called.

茉莉花间谍是否会foo以某种方式杀死其原生实施?如果我删除注释行,则测试通过.

rai*_*7ow 5

这个特定测试的目的是检查调用是否调用foo()结果bar().为此目的,...

it('calls bar', function() {
  spyOn(window, 'bar');
  foo();
  expect(bar).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)

... 足够了.是的,你必须模拟bar功能,所以它不会完成它的工作,只会报告它的调用.但没有办法,你应该嘲笑foospyOn你- 测试的功能,而不是模拟!

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

it('calls bar', function() {
  spyOn(window, 'foo').andCallThrough();
  spyOn(window, 'bar');
  foo();
  expect(bar).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)

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