我使用的是Reaction-Testing-Library,我有这样的main.tsx文件,所有Redux-Toolkit和Reaction-Router包装器如下所示:

ReactDOM.createRoot(document.getElementById("root")!).render(
  <React.StrictMode>
    <Provider store={store}>
        <Suspense fallback={<LoadingSpinner />}>
          <BrowserRouter>
            <Routes>
              <Route path="/*" element={<App />} />
            </Routes>
          </BrowserRouter>
        </Suspense>
    </Provider>
  </React.StrictMode>,
);

现在,当我try 测试使用任意useDispatchuseNavigate的任何组件时,测试失败,除非我使用下面这样的提供程序包装该组件:

test("Inputs should be initially empty", () => {
  render(
    <Provider store={store}>
      <BrowserRouter>
        <Login />
      </BrowserRouter>
      ,
    </Provider>,
  );
  const emailInput: HTMLInputElement = screen.getByRole("textbox", {
    name: /email/i,
  });
  expect(emailInput.value).toBe("");
});

现在,测试通过了,一切都很好.

我的问题是,有没有一种方法可以最初包装我要用这些包装器默认测试的所有组件?这样我就不必每次都用它们包装我的所有测试组件了?

推荐答案

创建一个wrapper组件,用于渲染任何提供者并包装childrenprops .

const ProviderWrapper = ({ children }) => (
  <Provider store={store}>
    <BrowserRouter>
      {children}
    </BrowserRouter>
  </Provider>
);
test("Inputs should be initially empty", () => {
  render(<Login />, { wrapper: ProviderWrapper });

  const emailInput: HTMLInputElement = screen.getByRole("textbox", {
    name: /email/i,
  });

  expect(emailInput.value).toBe("");
});

如果您只需要包装使用相同提供程序测试的101个组件,那么您也可以创建一个custom render function组件.

示例:

import {render} from '@testing-library/react';

const ProviderWrapper = ({ children }) => (
  <Provider store={store}>
    <BrowserRouter>
      {children}
    </BrowserRouter>
  </Provider>
);

const customRender = (ui, options) =>
  render(ui, { wrapper: ProviderWrapper, ...options });

// re-export everything
export * from '@testing-library/react';

// override render method
export { customRender as render };
test("Inputs should be initially empty", () => {
  render(<Login />); // <-- custom render already wraps with providers

  const emailInput: HTMLInputElement = screen.getByRole("textbox", {
    name: /email/i,
  });

  expect(emailInput.value).toBe("");
});

Typescript相关问答推荐

有没有办法适当缩小类型?

为什么typescript要把这个空合并转换成三元?

在配置对象上映射时,类型脚本不正确地推断函数参数

单击并移除for循环中的一项也会影响另一项

为什么TypeScript假设文档对象始终可用?

打字脚本中泛型和直接类型重新映射的不同行为

来自类型脚本中可选对象的关联联合类型

如何调整对象 struct 复杂的脚本函数的泛型类型?

刷新页面时,TypeScrip Redux丢失状态

正交摄影机正在将渲染的场景切成两半

从子类集合实例化类,同时保持对Typescript中静态成员的访问

如何使这种一对一关系在旧表上起作用?

将布尔值附加到每个对象特性

有没有办法传递泛型类型数组,以便推断每个元素的泛型类型?

TypeScrip:如何缩小具有联合类型属性的对象

TS不能自己推断函数返回类型

完全在类型系统中构建的东西意味着什么?

Vite+Chrome扩展 list v3-;不能在模块外使用import语句;对于inpage脚本

TS2532:对象可能未定义

根据索引将元组拆分为两个块