Open1
createRemixStubの使い方
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の動作を見るテストが、テストの壊れにくさとカバレッジのバランスが良さそう。