0

ジャスミンを使用していくつかの基本的なテストを行おうとしています。私は外部ライブラリを使用しています & 私がしようとしているのは、ライブラリ オブジェクト (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'

私は何を間違っていますか?

4

1 に答える 1

4

コードの失敗は次のとおりです

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

この行は、 を呼び出した場合にのみスパイを返しますd3()。したがって、d3オブジェクトを、呼び出されたときに を返す関数に置き換えます{select: jasmine.createSpy()}。ただし、d3 を使用すると、原因を呼び出すことはありません。d3()原因selectはの静的メンバーです。d3

したがって、解決策は「d3.select」をスパイすることだけです

spyOn(d3, 'select')

ところで。重鎖を使用するようなライブラリの問題D3は、モックするのが難しいことです。したがって、selectあなたの例のスパイは、d3 Selections オブジェクトなどに適合するオブジェクトを返す必要があります。そのため、すべてを嘲笑しない方が簡単な場合もあります。

于 2013-07-11T07:05:08.643 に答える