Testing 外部库的jasmine测试

Testing 外部库的jasmine测试,testing,d3.js,jasmine,Testing,D3.js,Jasmine,我试图用jasmine做一些基本的测试。我使用一个外部库&我打算对库对象(d3)进行spy/mock方法调用,并确保在d3上调用适当的方法 var d3Spy = jasmine.createSpyObj('d3', ['select']); spyOn(window, 'd3').andReturn(d3Spy); expect(d3Spy.select).toHaveBeenCalled(); 当对对象调用“select”时,我得到了这个错误

我试图用jasmine做一些基本的测试。我使用一个外部库&我打算对库对象(d3)进行spy/mock方法调用,并确保在d3上调用适当的方法

        var d3Spy = jasmine.createSpyObj('d3', ['select']);
        spyOn(window, 'd3').andReturn(d3Spy);
        expect(d3Spy.select).toHaveBeenCalled();
当对对象调用“select”时,我得到了这个错误

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'

我做错了什么?

代码中的错误如下

spyOn(window, 'd3').andReturn(d3Spy);
只有在调用
d3()
时,此行才会返回spy。因此,它用一个函数替换
d3
对象,该函数在调用时返回
{select:jasmine.createSpy()}
。但是使用d3,您永远不会调用
d3()
因为
select
d3的静态成员

所以解决办法就是监视'd3.select'

spyOn(d3, 'select')

顺便说一句,像
D3
这样使用重链的lib的问题是,很难模仿。因此,示例中的
select
spy必须返回适合d3选择对象的对象,以此类推。因此,有时不模仿所有内容会更容易。

代码中的错误如下

spyOn(window, 'd3').andReturn(d3Spy);
只有在调用
d3()
时,此行才会返回spy。因此,它用一个函数替换
d3
对象,该函数在调用时返回
{select:jasmine.createSpy()}
。但是使用d3,您永远不会调用
d3()
因为
select
d3的静态成员

所以解决办法就是监视'd3.select'

spyOn(d3, 'select')

顺便说一句,像
D3
这样使用重链的lib的问题是,很难模仿。因此,示例中的
select
spy必须返回适合d3选择对象的对象,以此类推。因此,有时不嘲笑一切会更容易。

你只是指出了我遇到的“所有问题”。由于链式方法调用的缘故,事情变得越来越复杂,因此我已从您提出的解决方案中恢复过来。现在,我已经停止监视所有的方法调用,只监视重要的方法调用&有简单的链式方法调用。由于链式方法调用的缘故,事情变得越来越复杂,因此我已从您提出的解决方案中恢复过来。现在,我已经停止监视所有方法调用,只监视重要的方法调用&具有简单的链式方法调用。