Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Test mockをSnapshot testする

Test mockをSnapshot testする

Tomohiko Himura

September 14, 2023
Tweet

More Decks by Tomohiko Himura

Other Decks in Technology

Transcript

  1. 概要 Test MockをSnapshot testする • なぜ Test MockをSnapshot testするか •

    Test Mockとは • Snapshot testとは • Test MockをSnapshot testしてみる
  2. Test mock - Jestを使った例 • JestはJavaScriptで使われるテスティングフレームワーク • Test mockになっている関数を作る機能がある(mock関数) •

    mock関数の呼び出しはmockプロパティに記録される const say = jest.fn() // mock関数 sayを作成している。 sayは呼び出せる say(‘hello’) // 引数 Helloで呼び出す say(‘bye’) // 引数 byeで呼び出す console.log(say.mock) /* ~> { calls: [ [ 'Hello' ], [ 'bye' ] ], // 引数 Helloとbyeで呼び出しがあった contexts: [ undefined, undefined ], // 実行環境の情報 instances: [ undefined, undefined ], invocationCallOrder: [ 1, 2 ], results: [ // 各呼び出しの戻り値の情報 { type: 'return', value: undefined }, { type: 'return', value: undefined } ], lastCall: [ 'bye' ] } */
  3. Snapshot test - Jestを使った例 test(“Snapshot Testの例”, () => { const

    output = { calls: [‘hello’] } // 関数の出力とする expect(output).toMatchSnapshot() // まだ出力を保存していない場合は保存する }); /* __snapshot__ ディレクトリにファイル名に .snap をつけたファイルに以下が保存される // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Snapshot Testの例 1`] = ` { "calls": [ "hello", ], } `; */
  4. Snapshot Testの例 test(“Snapshot Testの例”, () => { const output =

    { calls: [‘bye’] } // 関数の出力とする値をわざと変更する expect(output).toMatchSnapshot() // 出力が保存済みなので、保存された結果と比較 }); /* – 実行時の出力 Error: expect(received).toMatchSnapshot() Snapshot name: `Snapshot Testの例 1` { "calls": [ - "hello", + "bye", ], }
  5. Test mockをSnapshot testする function greeting(say) { say(‘hello’); say(‘bye’); } test(‘greeting’,

    () => { const say = jest.fn(); greeting(say); expect(say.mock).toMatchSnapshot(); });
  6. Test mockをSnapshot testする - 処理を変更 function greeting(say) { say(‘こにゃにゃちわー’); say(‘ほなら’);

    } test(‘greeting’, () => { const say = jest.fn(); greeting(say); expect(say.mock).toMatchSnapshot(); });
  7. Test mockをsnapshot testする - 実行してみる Snapshot name: `greeting 1` -

    Snapshot - 3 + Received + 3 @@ -1,12 +1,12 @@ { "calls": [ [ - "hello", + "こにゃにゃちわー ", ], [ - "bye", + "ほなら", ], ], "contexts": [ undefined, undefined, @@ -18,11 +18,11 @@ "invocationCallOrder": [ 1, 2, ], "lastCall": [ - "bye", + "ほなら", ], "results": [ { "type": "return", "value": undefined,
  8. Test mockをSnapshot testするの用途 • 自動テスト書かれていないコードのさくっと自動テストをつくる ◦ リファクタリングに役に立つ • mockを使いたいが丁寧に検証するのが面倒なとき ◦

    手抜きだけど、ないよりはましな場合がある • 丁寧に検証する前の確認として ◦ mockプロパティみたほうがはやくないか?
  9. まとめ Test mockをSnapshot testする • Test mock ◦ 期待どおりメソッドや関数が呼び出されるか確認するためのテク •

    Snapshot test ◦ 実行結果を保存し、テストの期待値とするテク • Test mockをSnapshot testする ◦ mockに対して呼び出しに変化ないか簡単にテストできるテク