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

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

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

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

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

sinonでメソッドをスタブする

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

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

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

このtestMethodの戻り値をsinonでスタブしてみます。

以下、index.test.jsです。

stub.returnsで通常の戻り値(Promiseなどではない)を指定しているので、これでスタブができたことになります。

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

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

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

sinonでメソッド内のメソッドをスタブする

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

以下はメソッド内のメソッドをスタブする例です。

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

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

sandboxでオブジェクトのキーに対するプロパティをスタブする

sinon.sandbox.create()メソッドでsandboxオブジェクトを返します。

※sandbox.create()は非推奨となっています

変わりにrequire('sinon').createSandbox()メソッドを使用します。

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

以下、実行例です。

結果は成功します。

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

sandbox.stubでPromiseの結果をスタブする

AWS.Service.prototypeのmakeRequestをスタブします。返すのはrejectするかresolveするかです。

Promsie.allの戻り値をresoleveまたはrejectします。

自作のUtilityモジュールのgetObjectメソッド(static async function)をスタブする例です。

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を使用します。

createSandboxメソッドでsandboxを作成し、afterEachでサンドボックスのrestoreします。

stubsとsandboxの最新ドキュメントです。

stubs

sandbox

環境変数をスタブします。

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

以下、実行例です。

オブジェクトをスタブする

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

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

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

参考サイト

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

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

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

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

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

sandbox.stub().returnsとresolvesとyieldsの違い

returnsは通常の戻り値を指定します。

resolvesrejectsはPromiseを指定します。

コールバック関数を持つ関数には yieldsまたはcallArgsWithを使用します。

sinonのアサーション

sinonには標準でアサーションが用意されています。

sandboxのアサーションです。Promise.allが何回呼ばれたかを検証しています。

calledOnce,calledTwice,calledThriceなどが用意されています。

https://sinonjs.org/releases/v10.0.0/sandbox/

戻り値メモ

listObjectsV2メソッドの戻り値例

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

コメントをどうぞ

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

CAPTCHA