跳转到内容

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 entries
render(
<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 definitions
render(
<RemixStub
hydrationData={{
loaderData: { root: { message: "hello" } },
}}
/>
);
// Test the app rendered with given future flags enabled
render(<RemixStub future={{ v3_coolFeature: true }} />);