webpack 如何在react路由器中测试一个延迟加载的组件?

czq61nw1  于 2022-11-13  发布在  Webpack
关注(0)|答案(1)|浏览(196)

我需要一种方法来测试一个组件,其中另外两个组件是延迟加载的。
我们正在使用webpack模块联合。因此,这里的ComponentOneComponentTwo是微前端,它们在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>组件(所以只封装了),但是我无法在测试中使用路由器。

ecr0jaav

ecr0jaav1#

我在尝试测试一个常规的延迟加载组件时发现了这个问题,我在这里找到了适用于我的this answer。基本上,您需要在react-testing-library中使用waitFor函数,以便在完成expect调用之前加载所有内容。
以下是上面链接的答案的相关片段:
LazyLoad.jsx

import React, {lazy} from 'react'
const LazyComponent = lazy(() => import('./LazyComponent'))
const LazyLoad = () => {
   return (
      <div>
         <div> Lazy component is here: </div>
         <React.Suspense fallback={null}>
             <LazyComponent />
         </React.Suspense>
      </div>
   )
}
export default LazyLoad

LazyComponent.jsx

import React from 'react'
export default () => <div>I am lazy ! </div>

LazyLoad.spec.jsx

import React from 'react'
import {render, waitFor } from 'react-testing-library'
import LazyLoad from 'LazyLoad'

test('renders lazy component', async () => {
    const { getByText } = render(<LazyLoad />)
    await waitFor(() => expect(getByText('I am lazy !' )).toBeInTheDocument())
})

相关问题