我需要一种方法来测试一个组件,其中另外两个组件是延迟加载的。
我们正在使用webpack模块联合。因此,这里的ComponentOne
和ComponentTwo
是微前端,它们在App
组件中延迟加载。因此,这里的App
组件是容器应用程序,它包含这两个应用程序,并提供它们之间的路由。
我的App.tsx
看起来像这样:
import { Suspense, lazy } from 'react';
import { Route, Routes } from 'react-router-dom';
const ComponentOne = lazy(() => import('components/ComponentOne));
const ComponentTwo = lazy(() => import('components/ComponeentTwo'));
export const App = () => {
return (
<Suspense fallback={<div>FallbackDummy</div>}>
<Routes>
<Route path="/" element={<ComponentOne />} />
<Route path="/two" element={<ComponentTwo />} />
</Routes>
</Suspense>
);
};
此应用程序组件在我的bootstrap.tsx
文件中使用,如下所示:
import { render } from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import { App } from './app/app';
render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root'),
);
我的App.test.tsx
看起来像这样:
import { Suspense } from 'react';
import {
render,
RenderResult,
} from '@testing-library/react';
import { App } from './App';
import '@testing-library/jest-dom';
describe('App component', () => {
let testedComponent: RenderResult;
beforeEach(() => {
testedComponent= render(
<Suspense fallback={<div>FallbackDummy</div>}>
<App />
</Suspense>
);
});
test('should match snapshot', () => {
expect(testedComponent).toMatchSnapshot();
});
});
测试运行时没有<Routes>
和<Route>
组件(所以只封装了),但是我无法在测试中使用路由器。
1条答案
按热度按时间ecr0jaav1#
我在尝试测试一个常规的延迟加载组件时发现了这个问题,我在这里找到了适用于我的this answer。基本上,您需要在
react-testing-library
中使用waitFor
函数,以便在完成expect
调用之前加载所有内容。以下是上面链接的答案的相关片段:
LazyLoad.jsx
:LazyComponent.jsx
:LazyLoad.spec.jsx
: