Open1

createRemixStubの使い方

GebGeb
    const RemixStub = createRemixStub([
      {
        path: '/play',
        loader() {
          return layoutLoader({ request, params: {}, context: {} });
        },
        Component: Layout, // ← 表示変化を見たいので親コンポーネントもスタブ
        children: [
          {
            path: '/play/buy-ingredients',
            loader() {
              return loader({ request, params: {}, context: {} });
            },
            async action({ request }) {
              await addAuthenticationSessionTo(request);
              return action({ request, params: {}, context: {} });
            },
            Component: Page, // ← テスト対象
            children: [
              {
                path: '/play/buy-ingredients/iron', // ← このactionにもpostするのでこれもスタブ
                async action({ request }) {
                  await addAuthenticationSessionTo(request);
                  return buyAction({ request, params: { name: 'iron' }, context: {} });
                },
              },
            ],
          },
        ],
      },
    ]);
    render(<RemixStub initialEntries={['/play/buy-ingredients']} />);
    // ↑ initialEntriesにアクセスするurlを設定しないと404になる。
    // スタブの`path`を空文字列にするとinitialEntriesなしでも動作する。原因不明。

テスト対象のルートファイルのloader, action, Componentに加えて、描画したい + actionを使いたいroute全てのスタブを定義する必要がある。
スタブを定義していない親コンポーネントは描画されない。
スタブを定義していないrouteのactionにpostするとnot foundになる。

今回の場合、テスト対象がPageだが、そのPageからpostした結果の状態変化が親コンポーネントに表示されるので、親コンポーネントもスタブしている。また、actionだけを定義した子ルートにPageからpostするので、子ルートもスタブしている。

スタブと言いつつ、loaderやactionは本物を読んでいるので、実質e2eテスト。基本的にloader, action, Component全て本物を使ってComponentの動作を見るテストが、テストの壊れにくさとカバレッジのバランスが良さそう。