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

时间:2013-09-20 20:36:08

标签: javascript jasmine

我有一些代码:

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是否会以某种方式杀死其原生实现?如果我删除了注释行,则测试通过。

2 个答案:

答案 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()