web-dev-qa-db-ja.com

シノンでJavaScriptのコンストラクターをスパイする

コンストラクターでスパイを作成しようとしていますが、それが呼び出されるかどうかを確認します。以下は私のテストです。私はsinon-chaiを使用しているので、構文は有効ですが、両方のテストが失敗します。

var foo = function(arg) {
};

var bar = function(arg) {
    var baz = new foo(arg);
};

it('foo initialized inside of this test', function() {
    var spy = sinon.spy(foo);
    new foo('test');
    expect(spy).to.be.called;
    expect(spy).to.be.calledWith('test');
});
it('foo initialized by bar()', function() {
    var spy = sinon.spy(foo);
    bar('test');
    expect(spy).to.be.called;
    expect(spy).to.be.calledWith('test');
});
21
billy

問題は、Sinonがどの参照をスパイするかを知らないことです。そのため、解決策は、オブジェクト、つまりsinon.spy(namespace, 'foo')を使用するか、自分で参照をオーバーライドすることですfoo = sinon.spy(foo)

6
billy

コンストラクターが「window」にバインドされていることを考慮すると、ブラウザーで開発者コンソールを開くと、関連する関数/コンストラクターを次のように使用してオブジェクトをインスタンス化できるはずです。

var temp = new FunctionName();

もしそうなら、実際の作業コードは次のようになります。

var jamesBond = sinon.spy(window, 'FunctionName');
var temp = new FunctionName(args);

expect(jamesBond.called).to.be.equal(true);
8
stckvflw

Nodeでこれを使用したい場合は、@ billyが言及したようなコンストラクターの名前空間を知っていると仮定して、@ stckvflwの答えを適合させることができます。 JS組み込みクラスの場合、それらがglobalにあると想定するのはおそらく正しいでしょう。

chai-spiesを使用してDateオブジェクトをフリーズする具体的な例(Sinonでstubを作成するのと同じ):

const moment = new Date();
chai.spy.on(global, 'Date', () => moment);
0
villasv