Closed2

Next.js の Experimental test mode for Playwright で MSW を使用した際に発生するエラーを解消する

KotaroKotaro

Playwright で Experimental test mode for Playwright の README を参考に MSW を使用したテストを走らせると、TypeError: mswHandlers is not iterable というエラーが発生してテストが通らない。

エラーが発生するテストの例:

import { test } from "next/experimental/testmode/playwright/msw";
import { expect } from "@playwright/test";
import { HttpResponse, http, delay } from "msw";

test.use({
  mswHandlers: [
    http.get("http://localhost:3000/api/foo", () =>
      HttpResponse.json({
        text: "foo",
      }),
    ),
    http.get("http://localhost:3000/api/bar", async () => {
      delay(1000);
      return HttpResponse.json({
        text: "bar",
      });
    }),
  ]
});

test("テスト", async ({ page, msw }) => {
  // ...
});
KotaroKotaro

以下のドキュメントに記載の通りだが、Fixtures のオプションの値が配列の場合は、追加の配列にラップする必要がある。

https://playwright.dev/docs/test-fixtures#:~:text=Array as an option value

test.use({
-  mswHandlers: [
+  mswHandlers: [[
    http.get("http://localhost:3000/api/foo", () =>
      HttpResponse.json({
        text: "foo",
      }),
    ),
    http.get("http://localhost:3000/api/bar", async () => {
      delay(1000);
      return HttpResponse.json({
        text: "bar",
      });
    }),
-  ]
+  ]]
});

ただし、これだと TypeScript を使用している場合型エラーが発生するので、自分は以下のようにしている。

test.use({
  mswHandlers: async ({}, use) => {
    await use([
      http.get("http://localhost:3000/api/foo", () =>
        HttpResponse.json({
          text: "foo",
        }),
      ),
      http.get("http://localhost:3000/api/bar", async () => {
        delay(1000);
        return HttpResponse.json({
          text: "bar",
        });
      }),
    ]);
  },
});

参考:

https://github.com/microsoft/playwright/issues/32667

https://github.com/microsoft/playwright/issues/33103

このスクラップは1ヶ月前にクローズされました