Jest と MSW 2 を利用して React Component が送信する multipart/form-data 形式の Request Body をテストする
サンプルコード
msw2-jest-sandbox
前提
背景
MSW 1 では モックした API に送信された multipart/form-data
形式の Request Body をパースできなかった。multipart/form-data
形式でリクエストを送信するフォームを実装している場合に、リクエスト内容を検証するテストコードを MSW を使って実装できないという課題があった。
MSW 2 を Jest 向けに設定する
Jest から MSW 2 のサーバーを動作させるといくつかのエラーが発生した。Frequent issues に記載の方法で解消できた。
また、MSW 2 を Jest で動作させるためには undici のインストールが必要だが、undici v6 は動作しないため v5 を利用する必要がある。
Always results in Network Error when using undici 6.x #2172
Request Body をテストする
例として、ユーザが名前と年齢を入力して送信できるフォームのテストコードを実装する。
まず、Next.js (App Router) の Client Component で以下のようにフォームを実装した。ちなみに App Router なので Server Action でも実装できるが、この記事の趣旨から外れるのでクライアントサイドから API をリクエストしている。
また、サンプル実装なのでバリデーションや異常系等は考慮していない。
page.tsx
次に以下のようにテストコードを実装した。重要な箇所には ⭐ 付きのコメントを付与した。
page.test.tsx
このように、multipart/form-data
形式の Request Body をテストできる。
Jest のプロセスが終了しない問題
実はサンプルコードの実装では、npm run test
で Jest を実行するとテストはパスするが、以下の文言が表示されプロセスが終了しない。
調査はしてみたが、原因は不明だった。おそらく MSW 2 に起因しているのではないかと推測している。
仕方がないので、--forceExit
オプションを付与して強制的に終了させている。