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

MSWの活用

 MSWの活用

2024/06/25 に BEENOS 株式会社主催LT会「BEELT」で発表した際の資料になります。
API モックサービスワーカーのライブラリ MSW についてお話しさせていただきました。とても便利なライブラリなのでおすすめです。

snoguchi1212

June 26, 2024
Tweet

More Decks by snoguchi1212

Other Decks in Programming

Transcript

  1. 野口 将輝 2024年4月 BEENOS 株式会社 入社 2023年5月から2024年3月まで内定者インターン 趣味: 野球観戦、服、コーヒー 今興味のある技術:

    GitHub Actions 現在は研修課題のアプリ制作でインフラを主に担当 技術スタック: React, NextJS, Laravel 自己紹介 0
  2. 従来の API モック手法 1 サーバーレベル モックサーバーを立ち上げ、テスト対象のアプリケ ーションはこのモックサーバーにリクエストを送信 する。 このサーバーが事前に設定したレスポンスを返す。 ex)

    JSON Server HTTPクライアント JSONファイル Backend DB JSON Server 呼び出し元 欠点2: POST 通信を行うとデータ元となるデータが更新さ れる(回避策はあるもののデータの生成が困難) 欠点1: エンドポイントをテスト環境と本番環境で切り替 える必要がある 欠点3: データの型安全性を保証できない MSW とは? 1 Localhost:xxx/users/1 https://xxx.com/users/1
  3. 従来の API モック手法 2 クライアントレベル 呼び出し元 Jest のモック Backend DB

    HTTPクライアント モックデータ 欠点1: HTTP クライアントについてのテストが難しい 欠点2: 固定データしか返すことができない ex) Jest アプリケーション内部で、リクエストを送る関数や ライブラリをモック化する。 例えば、Axios や Fetch などのリクエストライブラ リをモックライブラリで置き換える MSW とは? 1 https://xxx.com/users/1
  4. MSW の場合 呼び出し元 MSW Backend DB HTTPクライアント MSW が働く環境に設定することで、HTTP クライアント

    がリクエストを飛ばすと、その URL にマッチするリクエ ストをインターセプトして MSW が代わりに handler に 設定したレスポンスを返す handler サーバーレベルのモックの欠点 ・エンドポイントをテスト環境と本番環境で切り 替える必要がある ・POST 通信を行うとデータ元となるデータが更新 される (回避策はあるもののデータの生成が困難) ・データの型安全性を保証できない クライアントレベルのモックの欠点 ・HTTP クライアントについてのテストが難しい ・固定データしか返すことができない → @mswjs/data で対応可能 (今回は省略) 解決! MSW とは? 1 インターセプト https://xxx.com/users/1
  5. MSW の設定方法 2 MSW の利用設定 (Node.js 環境用) Step 3 Step

    4 MSWの起動 引用: MSW公式サイト/Getting started (https://mswjs.io/docs/getting-started)
  6. MSW の活用 3 MSW無効時 MSW有効時 (Nextjs.13 の App Directory には未対応

    ) https://github.com/mswjs/msw/issues/1644 ブラウザ上での確認 JSONPlaceholder にリクエスト を飛ばしている
  7. → handler をテストなどで上書きするときに、他のパスへの影響を防げる! MSW 使用上の Tips 4 1. Factory Method

    パターンの活用 ・resolver 以下は Factory Method にしておくと(個人的に)利用しやすい ・handler ・handlers (パスごとに handler をまとめた配列) → override 変数を渡すことで変数を上書きするような設定にする → error レスポンスの切り替えを簡単にできる + mock が一つの箇所にまとめられるので、保守性 UP!