2

我有一些代码:

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

4

2 回答 2

5

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

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

... 足够了。是的,你必须模拟bar函数,所以它不会做它的工作,它只会报告它的调用。但绝不应该模拟- 你正在测试函数,而不是模拟foospyOn

如果,由于某种原因,你应该观察它,使用andCallThroughspy 方法:

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

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

于 2013-09-20T21:06:00.930 回答
0
spyOn(window, 'foo').andCallThrough()
于 2013-09-20T20:43:15.343 回答