オブジェクト内の関数でSinonを使用すると、機能します。
function myFunc() {
console.log('hello');
}
var myObj = { myFunc: myFunc };
var spy = sinon.stub(myFunc);
myObj.myFunc();
expect(spy.called).to.be.true();
ただし、次のようにスタンドアロン関数でSinonを使用する理由がわかりません。
function myFunc() {
console.log('hello');
}
var spy = sinon.stub(myFunc);
myFunc();
expect(spy.called).to.be.true();
アサーションは失敗します。
あなたはkindaでしたが、逸脱しました。あなたの努力を見て、正しいことをしましょう:
// ...
function myFunc() {
console.log( 'hello' );
}
var spiedMyFunc = sinon.spy( myFunc ); // what you want is a 'spy' not a 'stub'
// ...
次に、この時点でspiedMyFunc
はmyFunc
をラップします。したがって、spiedMyFunc()
を呼び出すと、ほとんどの場合amount tomyFunc()
を呼び出す場合と同じ結果になります。その間spiedMyFunc
追加
すべての呼び出しの引数、この値、例外、および戻り値を記録します。
したがって、残りのコードスニペットは次のようになります。
// myFunc(); // no you should be calling spiedMyFunc() instead
spiedMyFunc();
expect( spiedMyFunc.called ).to.be.true();
そして、それがstandalone関数をスパイする方法です。ただし、standalone関数をスタブ化することは概念的に意味がありません。
この回答に関するコメントで @ charlesdeb の質問に回答する:
メソッドが呼び出されると、他のメソッドを暗黙的に呼び出すチェーンをトリガーできます。この暗黙的または間接的な呼び出しが原因で、特定のメソッドの動作をチェーン内の他のメソッドの動作を制御する一方で、学習したい場合があります。 * Stubbing *は、このコントロールを実現するための手段です。
関数を使用する場合、実際に機能パラダイムに従って、物事を簡単かつ信頼できるものにすることが有益です。このことを考慮:
function a () { ... }
function b () { a(); }
b
をテストする場合、b()
の実行がa()
を実行したことを証明することが必要かつ十分です。しかし、b
の実装方法では、a
が呼び出されたことを確認することは不可能です。
ただし、機能的なパラダイムを適用すると、
function a () { ... }
function b ( a ) { a(); }
したがって、次のような簡単なテストを作成できます。
var a_spy = sinon.spy( a );
var actualOutcomeOfCallingB = b( a_spy );
expect( a_spy.called ).to.be.true;
expect( actualOutcomeOfCallingB ).to.equal( expectedOutcome );
stuba
を使用する場合は、実際のa
でスパイを作成する代わりに、好みのスタブで作成します。
var a_stub = sinon.spy( function () { /* behaves differently than the actual `a` */ } ); // that's your stub right there!
var actualOutcomeOfCallingB = b( a_stub );
expect( a_stub.called ).to.be.true;
expect( actualOutcomeOfCallingB ).to.equal( expectedOutcome );
ブラウザ側に解決策があるかどうかわかりません。
ただし、node.js環境で実行すると、関数をエクスポートして別のファイルでテストできます。
たとえば、ソースファイルはsource.js
およびテストファイルはtest.js
Source.js
function myFunc() {
console.log('hello');
}
module.exports.myFunc = myFunc;
Test.js
var source = require('./source');
var sinon = require('sinon');
var expect = require('chai').expect;
sinon.stub(source, 'myFunc').returns(true);
source.myFunc();
expect(sinon).to.be.true;
これがお役に立てば幸いです。