Jest.js 如何使用React-Router-DOM v6的Outlet编写测试?

41zrol4v  于 2023-11-15  发布在  Jest
关注(0)|答案(1)|浏览(158)

我正在用Jest写测试,我遇到了来自React-Router-DOM的Outlet的问题。
我有一个名为Preferences的组件,它嵌套在另一个路由器中。在Preferences中,我有5个子路由:

{/* Route for Preference. */}
<Route
  path="/preferences"
  element={<LazyComponent component={'LazyPreferences'} />}
>
  <Route index element={<LazyComponent component={'LazyAccount'} />} />
  <Route
    path="accounts-1"
    element={<LazyComponent component={'Account-1'} />}
  />
  <Route
    path="accounts-2"
    element={<LazyComponent component={'Account-2'} />}
  />
  <Route
    path="accounts-3"
    element={<LazyComponent component={'Account-3'} />}
  />
</Route>

字符串
Preferences组件中,我从React-Router-DOM中使用Outlet,如下所示:

const Preferences = () => {
  return (
    <Provider>
      <PreferencesMenu />
      <Outlet />
    </Provider>
  )
}


当我模拟Preferences组件时,它只显示Preferences导航。我如何处理像Account-1,.这样的子组件?
这是我的测试

describe('Preferences screen with Account', () => {
    beforeEach(cleanup)

    afterEach(() => {
      jest.clearAllMocks()
    })

    test('Click on the Account option, router will navigate to /accounts', async () => {

          const wrapper = mountWithApp(<Preferences />)

        expect(wrapper).toContainReactText('ACCOUNT')

        await userEvent.click(screen.getByText('ACCOUNT'))
        expect(mockedUseNavigate).toHaveBeenCalledWith('/preferences/accounts')
      })
})

izj3ouym

izj3ouym1#

由于导航菜单正在显示,您只需在菜单项上创建单击事件即可导航到插座路由。因此,您可以在导航后测试插座组件是否显示在文档上。
要使用<Outlet />组件,您需要使用<MemoryRouter />渲染<Preferences />

render(
    <MemoryRouter>
       <Preferences />
    </MemoryRouter>
 )

字符串
此外,您似乎一直在使用自定义匹配器和函数,您可以使用rendergetByText/getByRole

相关问题