0

我正在尝试使用 jasmine 进行一些基本测试。我使用一个外部库,我打算做的是监视/模拟库对象(d3)上的方法调用,并确保在 d3 上调用适当的方法。

        var d3Spy = jasmine.createSpyObj('d3', ['select']);
        spyOn(window, 'd3').andReturn(d3Spy);
        expect(d3Spy.select).toHaveBeenCalled();

在对象上调用“选择”时,出现此错误。

TypeError: Object function () {
spyObj.wasCalled = true;
spyObj.callCount++;
var args = jasmine.util.argsToArray(arguments);
spyObj.mostRecentCall.object = this;
spyObj.mostRecentCall.args = args;
spyObj.argsForCall.push(args);
spyObj.calls.push({object: this, args: args});
return spyObj.plan.apply(this, arguments);
 } has no method 'select'

我究竟做错了什么?

4

1 回答 1

4

您的代码中的失败如下

spyOn(window, 'd3').andReturn(d3Spy);

此行将仅在您调用时返回间谍d3()。所以它d3用一个函数替换对象,当它被调用时返回{select: jasmine.createSpy()}. 但是使用 d3 你永远不会调用d3()causeselect是一个静态成员d3

所以解决方案就是监视“d3.select”

spyOn(d3, 'select')

顺便提一句。像D3这样使用重链的库的问题在于,它很难模拟。因此select,您示例中的间谍必须返回适合 d3 Selections 对象的对象,依此类推。因此,有时不模拟所有内容会更容易。

于 2013-07-11T07:05:08.643 回答