24

コンストラクターでスパイを作成しようとしていますが、それが呼び出されるかどうかを確認します。以下は私のテストです。私は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');
});
4

3 に答える 3

10

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

于 2013-02-12T17:48:26.860 に答える
10

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

var temp = new FunctionName();

その場合、実際に機能するコードは次のようになります。

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

expect(jamesBond.called).to.be.equal(true);
于 2015-06-23T08:10:34.627 に答える
0

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

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

const moment = new Date();
chai.spy.on(global, 'Date', () => moment);
于 2018-04-17T15:19:54.910 に答える