一个项目使用Reaction-RouterV6,在某些组件中我称之为useLoaderData().例如:

const routes = [
    { path: "widgets", 
      loader: () => fetchAndGetJSON("/api/widgets"), 
      element: <ListWidgets/> }
];

function ListWidgets() {
    const widgets = useLoaderData();
    return <>
        <p>Here is a list of {widgets.length} widgets:
        <...>
    </>;
}

在测试时,我不想执行fetch,我想提供测试中的小部件列表.

如何使用我在测试中提供的数据为ListWidgets创建单元测试?

推荐答案

我自己还没有用过Reaction路由的数据API,但据我所知,有三种主要的替代方案.

  1. 将Jest的标准模仿功能用于mock fetch、模仿fetchAndGetJSON或类似的功能.
    global.fetch = jest.fn(() =>
      Promise.resolve({
        json: () => Promise.resolve(FAKE_TEST_DATA),
      })
    );
    
    beforeEach(() => fetch.mockClear());
    
  2. createMemoryRouter与您的路由的测试版本一起使用,该版本将呈现<ListWidgets/>与返回所需测试数据的自定义loader.
    test(ListWidgets, async () => {
      const routes = [{
        path: "widgets",
        element: <ListWidgets />,
        loader: () => FAKE_TEST_DATA,
      }];
    
      const router = createMemoryRouter(routes, { initialEntries: ["widgets"] });
    
      render(<RouterProvider router={router} />);
      // ...testing...
    }
    
  3. 使用Mock Service Worker (msw.js)创建模拟后端.在功能上,这非常类似于你自己嘲笑fetch,但MSW非常擅长精简和整合东西.
    const worker = setupWorker(
      rest.get('/api/widgets', async (req, res, ctx) => {
        const { username } = await req.json();
        return res(ctx.json(FAKE_TEST_DATA))
      }),
    );
    
    worker.start();
    

我是msw.js的铁杆粉丝,但任何选项都应该有效.(这在某种程度上是一种取舍:覆盖loader会导致目标更窄的单元测试,而msw.js允许您编写更接近集成测试端的侵入性较小的测试.)

Reactjs相关问答推荐

有正确的方法来设置我的金牛座应用程序的图标吗?

如何在useEffect中使用useParams()

Tailwind不使用@apply classes构建,并强制使用类似于移动的viewport

有没有一种惯用的方式来接受特定的子元素?

使用自动播放的视频组件呈现登录页面时出现JEST测试错误

svg每条路径上的波浪动画

更改点几何体的坐标会将其隐藏

使用Next.js和Next-intl重写区域设置

在 golang 服务器中刷新或直接 url 路径时响应 404

无法使用react-hook-form和react-places-autocomplete在字段中输入值

如何优化 React 应用程序的性能?

如何使用样式化函数为 TextField 的输入组件设置样式

在准备回调中使用状态属性(Redux 工具包)

RTK 查询Mutations 在 StrictMode 中执行两次

如何在对话素材ui中设置边框半径?

如何使用 babel 将 SVG 转换为 React 组件?

如何将 id 从页面传递到另一个页面?

无法有条件地更新useEffect中的setState

将 C# Razor 条件块转换为 React.js 代码

如何在 NavBar 中设置动态标题