当前位置: 首页 > 知识库问答 >
问题:

如何使用新的路由器挂钩测试组件?

陈龙野
2023-03-14

到目前为止,在单元测试中,响应路由器匹配参数作为组件的道具被检索。因此,测试一个组件,考虑一些特定的匹配,与特定的url参数,是很容易的:我们只需要精确路由器匹配的道具,因为我们想要在测试中渲染组件(我使用酶库的目的)。

我真的很喜欢检索路由内容的新钩子,但我没有找到关于如何在单元测试中使用新的react路由器钩子模拟react路由器匹配的示例?

共有3个答案

鲁英卫
2023-03-14

在您的组件中,使用如下所示的钩子

import {useLocation} from 'react-router';

const location = useLocation()

在您的测试中,监视reactRouter对象,如下所示

import routeData from 'react-router';

const mockLocation = {
  pathname: '/welcome',
  hash: '',
  search: '',
  state: ''
}
beforeEach(() => {
  jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation)
});
谭越
2023-03-14

我查看了react路由器repo中的钩子测试,看起来您必须将组件封装在MemoryRouter路由中。为了让我的测试顺利进行,我最终做了这样的事情:

import {Route, MemoryRouter} from 'react-router-dom';

...

const renderWithRouter = ({children}) => (
  render(
    <MemoryRouter initialEntries={['blogs/1']}>
      <Route path='blogs/:blogId'>
        {children}
      </Route>
    </MemoryRouter>
  )
)

希望有帮助!

李谦
2023-03-14

编辑:按照Catalina Astengo的回答中描述的方式来做这件事的正确方法,因为它使用真正的路由器功能,只是嘲笑历史/路由状态,而不是嘲笑整个钩子。

我最终解决它的方法是使用jest.mock嘲笑测试中的钩子:

// TeamPage.test.js
jest.mock('react-router-dom', () => ({
  ...jest.requireActual('react-router-dom'), // use actual for all non-hook parts
  useParams: () => ({
    companyId: 'company-id1',
    teamId: 'team-id1',
  }),
  useRouteMatch: () => ({ url: '/company/company-id1/team/team-id1' }),
}));

我用开玩笑。requireActual将react路由器dom的真实部分用于除我感兴趣的模拟挂钩之外的所有内容。

 类似资料:
  • 上面的测试示例不起作用,但用于演示我试图实现的目标。并实际呈现0 div,因为组件中声明的初始状态包含0项。 > 为了测试的目的,我应该如何修改一个reducer的状态或者更改它部署时的initialState? 我习惯于在多个组件中使用Redux还原程序,但是useReducer需要一个传递的initialState。。。这就提出了一个问题:react-hook的reducer是作为一个实例通过

  • 问题内容: 我正在使用酶+摩卡+柴来测试我的react-redux项目。酶提供浅浅以测试组件的行为。但是我没有找到测试路由器的方法。我正在使用如下的react- router: 我要测试此路由参考组件。如何在reactjs项目中对其进行测试? 编辑1 我正在使用作为路由器框架。 问题答案: 您可以将路由器包装在组件中以对其进行测试。 Routes.jsx index.js 然后,您必须对组件进行浅

  • 问题内容: 我刚刚阅读了React的新功能挂钩。了解有关钩子的信息, 但我无法使用它。它给我错误。 我目前正在使用16.6.0版 终于我明白了钩子。 我导入为Fun并在app.js文件中使用 我犯的错误是我没有安装React v16.7.0-alpha,所以我使用npm安装了add react @ next react-dom @ next。 谢谢 问题答案: 编辑: 挂钩是16.8.0版的一部分

  • 问题内容: 当我用酶测试类组件时,我可以设置状态。当我用钩子测试功能组件时,现在该怎么做? 例如,在我的组件中,我有: 我想在测试中进行更改 问题答案: 使用挂钩状态时,您的测试必须忽略诸如状态之类的实现细节,以便对其进行正确测试。您仍然可以确保组件将正确的状态传递到其子级。 您可以在Kent C. Dodds撰写的这篇博客文章中找到一个很好的例子。 这是摘录的代码示例。 依赖状态执行细节的测试-

  • 问题内容: 考虑下面的钩子示例 基本上,我们使用this.forceUpdate()方法强制组件在React类组件中立即重新呈现,如以下示例所示 但是我的查询是如何强制上述功能组件立即使用挂钩重新渲染? 问题答案: 可以使用或进行,因为在内部使用: 不打算在正常情况下使用,仅在测试或其他出色情况下使用。可以以更常规的方式解决这种情况。 是使用不当的例子,是异步的性能,而且不应该被强迫只是因为状态更

  • 我有一个关于Vuejs和Vue路由器的项目。当用户登录系统时,服务器返回一个带有令牌、用户名和名字的Json文件,该文件存储在localstorage中,以便在以下请求中使用。第一个名称在布局中用于在导航栏中显示欢迎消息。注销后,localstorage被清除,问题就在这里,当其他用户在消息welcome not reload中使用新的名字付费时。