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

MSWの活用

 MSWの活用

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

Avatar for snoguchi1212

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!