node.jsのソースを単体テストする際のmocha+sinonの使い方

求人

node.jsのソースをmochaでテストしているとsinonでモックしてテストする、といったケースがあると思います。

node.jsのソースを単体テストする際のmocha+sinonの使い方

sinonは英語ドキュメントもありますし、広く使われているモジュールなのでモックの方法がネットにごろごろ転がっています。

簡単なソースでsinonを試してみたいと思います。

以下をindex.jsで保存します。

exports.sampleという変数にtestMethodを代入します。これでtestMethodをsampleという名前で他のモジュールからも使えるようにします。

このtestMethodの戻り値をsinonでモックしてみます。

以下、index.test.jsです。

stub.returnsで戻り値を指定しているので、これでモックができたことになります。

そのあとにsample()を実行すると引数が何であっても戻り値は指定した戻り値となります。

結果は以下のようになります。

node.jsのソースを単体テストする際のmocha+sinonの使い方

メソッド内のメソッドをsinonでモックする

実際はメソッド内にあるDBに検索するメソッドなどをモックするというケースが多いかと思います。

以下はメソッド内のメソッドをモックする例です。

getTaxは通常はDBから取得すると思いますが、モックできるかのテストなので1.08を返すだけにしました。

index.test.jsで1.08を返すのをスタブ化し、1.10を返すようにしています。テスト自体はtestMethodメソッドから実行しています。

オブジェクトのキーに対するプロパティをモックする
sinon.sandbox.create()メソッドでsandboxオブジェクトを返します。

このように記述するとオブジェクトのキーに対するプロパティをモックすることができます。

以下、実行例です。

結果は成功します。

node.jsのソースを単体テストする際のmocha+sinonの使い方

sinonのエラー

Cannot stub non-existent own property XXX

…XXXというメソッドがない場合にこのエラーが発生する。

TypeError: Attempted to wrap execute which is already wrapped

…すでにモックしているものをもう一度モックしようとすると発生する。

sinonの評価はmocha+chaiの使い方を参照して下さい。

process.env(環境変数)をモックする方法

process.env(環境変数)をモックするにはsandboxを使用します。

beforeEachでsandboxを作成し、afterEachでrestoreします。

上記で環境変数PATHの値を変えることができます。但し、環境変数がPCに設定されていない場合は以下のようなエラーとなります。

以下、実行例です。

オブジェクトをモックする

sinon.stubメソッドは第一引数でオブジェクトだけを指定することができます。

この場合、targetが持つすべてのメソッドをモックすることになります。

targetはaaa,bbb,cccと言うメソッドを持つとします。その場合、以下のように全てのメソッドをrestore()する必要があります。

参考サイト

メソッドの戻り値を動的に変更する

メソッドをモックすることができますが、1回目の戻り値と2回目の戻り値を変更したい場合があります。

以下のようにonCallメソッドを使用します。

onCall(0)が1回目の戻り値になります。

onCall(1)が2回目の戻り値になります。

関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
Python3.6,Djangoを勉強中です,Javaは少し飽きてしまってます–;
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくば、我に七難八苦を与えたまえ」です^^

スポンサーリンク
  • このエントリーをはてなブックマークに追加
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA