@remix-run/testing

このパッケージには、Remixアプリケーションの一部のユニットテストを支援するためのユーティリティが含まれています。これは、コンパイラによって出力されるRemixルートモジュール/アセットマニフェストをモックし、createMemoryRouter を介してインメモリのReact Routerアプリを生成することで実現されます。

このパッケージの一般的な使い方は、クリーンにモックすることができないRemixのフック/コンポーネント(useLoaderDatauseFetcherなど)に依存するコンポーネント/フックをテストすることです。リンクをクリックしてページをナビゲートするなどのより高度なテストにも使用できますが、それらはCypressPlaywrightのようなツールを使用したエンドツーエンドテストに適しています。

使用法

createRemixStubを使用するには、React Routerのようなルートオブジェクトを使用してルートを定義します。ここで、pathComponentloaderなどを指定します。これらは基本的に、Remixアプリのルートファイルのネストとエクスポートをモックしています。

import { createRemixStub } from "@remix-run/testing";
 
const RemixStub = createRemixStub([
  {
    path: "/",
    Component: MyComponent,
    loader() {
      return json({ message: "hello" });
    },
  },
]);

次に、<RemixStub />コンポーネントをレンダリングして、それに対してアサートできます。

render(<RemixStub />);
await screen.findByText("Some rendered text");

jestReact Testing Libraryを使用した完全な動作例を次に示します。

import { json } from "@remix-run/node";
import { useLoaderData } from "@remix-run/react";
import { createRemixStub } from "@remix-run/testing";
import {
  render,
  screen,
  waitFor,
} from "@testing-library/react";
 
test("renders loader data", async () => {
  // ⚠️ これは通常、アプリのコードからインポートするコンポーネントです
  function MyComponent() {
    const data = useLoaderData() as { message: string };
    return <p>Message: {data.message}</p>;
  }
 
  const RemixStub = createRemixStub([
    {
      path: "/",
      Component: MyComponent,
      loader() {
        return json({ message: "hello" });
      },
    },
  ]);
 
  render(<RemixStub />);
 
  await waitFor(() => screen.findByText("Message: hello"));
});