web-dev-qa-db-ja.com

スタンドアロン関数のシノンスパイ

オブジェクト内の関数で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(); 

アサーションは失敗します。

18
giangnn

あなたはkindaでしたが、逸脱しました。あなたの努力を見て、正しいことをしましょう:

// ...
function myFunc() {
    console.log( 'hello' );
}
var spiedMyFunc = sinon.spy( myFunc ); // what you want is a 'spy' not a 'stub'
// ...

次に、この時点でspiedMyFuncmyFuncをラップします。したがって、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 );
16
Igwe Kalu

ブラウザ側に解決策があるかどうかわかりません。

ただし、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;

これがお役に立てば幸いです。

1
Yu Huang