概要
Sinon.JSのAPIで、私がよく使うものをメモ。
合わせて、検証時のChaiとの組み合わせ例も記載。
スタブ関数の動作を設定するAPI
n 回目の呼び出し時に、値Zを返却する。
stubA.onCall(0).returns("hoge"); // 初回(=0 回目)の呼び出しで "hoge" を返す。
stubA.onCall(n).returns(
Promise.resolve({"result" : "OK"})
); // n 回目の呼び出しで {"result" : "OK"} を引数としたPromise.resolve()インスタンスを返す。
引数A で呼び出されたら、値Zを返却する。
stubA.withArgs( "hoge" ).returns(
{ "message" : "OK" }
); // 引数 "hoge" で呼び出されたら、{ "message" : "OK" }を戻り値として返却する。
呼び出されたら、即座にcallbackA関数を引数Bを用いて実行する。
stubA.callsArgWith( 0, "hoge" ); // stubA( function(param1){ /* ぴよぴよ */ } )の呼び出しに対して、stubAの1番目の引数をcallback関数とみなして、引数param1に"hoge"を指定した上で即座に callback関数を実行する。
stubA.callsArgWith( 2, null, {"value" : "OK"} ); // stubA()の2番目(0オリジン)の引数をcallback関数と見なして実行する。詳細は以下のコメント内を参照。
/*
stubA( param0, param1, function(err, result){
// 何らかのコールバック処理。
});
// 上記↑のようにスタブ関数stubA()を呼び出した際に、
// その2番目の引数(0オリジン)をcallback関数と扱って、
// function( err=null, result={"value" : "OK"} );
// として即座に実行する。
*/
呼び出された時の動作を、任意に設定する。
stubA.callsFake( function(str){ return str; } ); // スタブ作成の観点では stubA = sinon.spy( function(str){ return str; } ); と同等の動作。
// 本来は、オブジェクト内の既存メソッドを、任意の関数で動作を置き換えたうえでスタブ化するのが目的のAPI。
実行後のスタブ関数の呼び出し状況を取得するAPI
1回でだけ呼び出されたか?を true / false で取得する。
stubA.calledOnce;
assert( stubA.calledOnce, "stubA()を1回だけ呼び出すこと" );
1回目の呼び出しの引数を取得する。
stubA.getCall(0).args; // ⇒ [ args0, args1,,, ] 引数の配列が返る。
expect( stubA.getCall(0).args[0] ).to.equal( "hoge", "1回目の呼び出しの引数の1つ目が「"hoge"」であること" );
expect( stubA.getCall(1).args[1] ).to.be.null; // 2回目の呼び出しの引数の2つ目が null であること。
expect( stubA.getCall(1).args[0] ).to.have.property("status").to.equal(200); // 2回目の呼び出しの引数の1つ目がプロパティ"status"を持ち、且つその値が「200」であること。
特定の引数で1回だけ呼び出されたか?を true / false で取得する.
stubA.withArgs( "hoge" ).calledOnce;
assert( stubA.withArgs( "hoge" ).calledOnce, "stubA()を引数「hoge」で1度だけ呼び出すこと" );
呼び出された回数を取得する。
stubA.callCount;
expect( stubA.callCount ).to.equal( 3, "stubA()が3回呼び出されること" );
1度も呼び出されなかったか?を true / false で取得する.
stubA.notCalled;
assert( stubA.notCalled, "stubA()が1度も呼ばれないこと" );
参考リンクなど
Sinon.JSの公式トップページ
https://sinonjs.org/
Sinon.JSのスタブ関数の動作設定用APIの仕様
https://sinonjs.org/releases/v1.17.7/stubs/
Sinon.JSのスタブ/スパイ関数の動作検証用APIの仕様
https://sinonjs.org/releases/v1.17.7/spies/
Chaiの公式トップページ
http://www.chaijs.com/
Chaiのexpect()のLanguage Chains(to.equal()とか)の仕様
http://www.chaijs.com/api/bdd/