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

Test mockをSnapshot testする

Test mockをSnapshot testする

Avatar for Tomohiko Himura

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に対して呼び出しに変化ないか簡単にテストできるテク