createRemixStub
该实用程序允许您通过设置一组模拟的路由来对依赖于 Remix 钩子 / 组件的组件进行单元测试:
import { createRemixStub } from "@remix-run/testing";
test("renders loader data", async () => {  const RemixStub = createRemixStub([    {      path: "/",      meta() {        /* ... */      },      links() {        /* ... */      },      Component: MyComponent,      ErrorBoundary: MyErrorBoundary,      action() {        /* ... */      },      loader() {        /* ... */      },    },  ]);
  render(<RemixStub />);
  // Assert initial render  await waitFor(() => screen.findByText("..."));
  // Click a button and assert a UI change  user.click(screen.getByText("button text"));  await waitFor(() => screen.findByText("..."));});如果你的 loader 依赖于 getLoadContext 方法,你可以通过 createRemixStub 的第二个参数提供一个存根上下文:
const RemixStub = createRemixStub(  [    {      path: "/",      Component: MyComponent,      loader({ context }) {        return json({ message: context.key });      },    },  ],  { key: "value" });如果你需要控制初始 URL、历史堆栈、水合数据或未来标志,则 <RemixStub> 组件本身具有与 React Router 类似的属性:
// Test the app rendered at "/2" with 2 prior history stack entriesrender(  <RemixStub    initialEntries={["/", "/1", "/2"]}    initialIndex={2}  />);
// Test the app rendered with initial loader data for the root route.  When using// this, it's best to give your routes their own unique IDs in your route definitionsrender(  <RemixStub    hydrationData={{      loaderData: { root: { message: "hello" } },    }}  />);
// Test the app rendered with given future flags enabledrender(<RemixStub future={{ v3_coolFeature: true }} />);