外部图书馆的茉莉花测试

时间:2013-07-11 04:00:15

标签: testing d3.js jasmine

我正在尝试使用茉莉花进行一些基本测试。我使用的是外部库和我打算做的是spy / mock对库对象(d3)的方法调用,并确保在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'

我做错了什么?

1 个答案:

答案 0 :(得分:4)

您的代码失败如下

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

只有当您拨打d3()时,此行才会返回间谍。所以它用一个函数替换d3对象,当它被调用时返回{select: jasmine.createSpy()}。但是使用d3,您永远不会致电d3()因为selectd3的静态成员

因此,解决方案就是监视“d3.select”

spyOn(d3, 'select')

顺便说一下。像D3这样使用大量链接的库的问题是,它难以模拟。因此,示例中的select间谍必须返回适合d3 Selections对象的对象,依此类推。所以有时候不要嘲笑一切都会更容易。