如何使用 MemoryRouter 来测试 useParams 调用

Posted

技术标签:

【中文标题】如何使用 MemoryRouter 来测试 useParams 调用【英文标题】:How to use MemoryRouter in order to test useParams call 【发布时间】:2020-12-27 06:50:28 【问题描述】:

我有一个名为 Component.ts 的假设 React 组件,其代码结构类似于:


import React,  FC  from 'react';
import  useParams  from 'react-router-dom';

export const Guide: FC<> = () => 

  const  serviceId  = useParams();

  return (
    <p>serviceId</p>
  )



为了测试这个组件的行为,我试图在我的Component.test.ts 文件中执行类似于以下内容的操作:


import React from 'react';
import  render  from '@testing-library/react';
import  Component  from './Component';
import  Route, MemoryRouter  from 'react-router-dom';


test('my Component test', async () => 

  const someServiceId = 'some-service-id';

  const  findByText  = render(
    <MemoryRouter initialEntries=[`guides/$someServiceId`]>
      <Route path='guides/:serviceId'> 
        <Guide />
      </Route>
    </MemoryRouter> 
  );
      
  expect(await findByText(someServiceId)).toBeInTheDocument();

);

当我使用 react-router-dom 的版本 5.2.2 时,我的测试正在运行,但自从我更新到 6.0.0-beta.0 后它就失败了。运行测试时,Jest 显示以下消息:

Relative pathnames are not supported in createMemoryHistory( initialEntries ) (invalid entry: "guides/some-service-id")

【问题讨论】:

【参考方案1】:

经过一番搜索,我找到了答案in the test suite。

6.0.0-beta.0 中的技巧是将&lt;Route /&gt; 包装在&lt;Routes /&gt; 中。另请注意,组件是从 react-router 而不是 react-router-dom 导入的:

import 
  MemoryRouter,
  Routes,
  Route,
 from 'react-router';

test('my Component test', async () => 
  const someServiceId = 'some-service-id';

  const  findByText  = render(
    <MemoryRouter initialEntries=[`guides/$someServiceId`]>
      <Routes>
        <Route path='guides/:serviceId'> 
          <Guide />
        </Route>
      </Routes>
    </MemoryRouter> 
  );
      
  await waitFor(() => expect(findByText(someServiceId)).toBeInTheDocument());
);

【讨论】:

以上是关于如何使用 MemoryRouter 来测试 useParams 调用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MemoryRouter 和 Jest 设置匹配路径? (不是位置或历史)

React/Router/MemoryRouter - 如何传递历史属性并在子组件中使用 push()?

使用initialEntries测试react-router(带有Enzyme)

如何使用 DataGrip SQL 格式化程序来对齐 USING/ON 子句

基准测试(python vs. c++ using BLAS)和(numpy)

如何测试数据帧最后一行中的特定值(使用-1)