コンストラクターでスパイを作成しようとしていますが、それが呼び出されるかどうかを確認します。以下は私のテストです。私は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');
});
問題は、Sinonがどの参照をスパイするかを知らないことです。そのため、解決策は、オブジェクト、つまりsinon.spy(namespace, 'foo')
を使用するか、自分で参照をオーバーライドすることですfoo = sinon.spy(foo)
。
コンストラクターが「window」にバインドされていることを考慮すると、ブラウザーで開発者コンソールを開くと、関連する関数/コンストラクターを次のように使用してオブジェクトをインスタンス化できるはずです。
var temp = new FunctionName();
もしそうなら、実際の作業コードは次のようになります。
var jamesBond = sinon.spy(window, 'FunctionName');
var temp = new FunctionName(args);
expect(jamesBond.called).to.be.equal(true);
Nodeでこれを使用したい場合は、@ billyが言及したようなコンストラクターの名前空間を知っていると仮定して、@ stckvflwの答えを適合させることができます。 JS組み込みクラスの場合、それらがglobal
にあると想定するのはおそらく正しいでしょう。
chai-spies
を使用してDate
オブジェクトをフリーズする具体的な例(Sinonでstub
を作成するのと同じ):
const moment = new Date();
chai.spy.on(global, 'Date', () => moment);