Sinon.JSチートシート、を目指したメモ


概要

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/