使用 React-testing-library 进行测试时出现 Next.js 路由器错误

Posted

技术标签:

【中文标题】使用 React-testing-library 进行测试时出现 Next.js 路由器错误【英文标题】:Next.js router error while testing using React-testing-library 【发布时间】:2021-09-24 15:55:46 【问题描述】:

我只是在尝试渲染一个组件的初步测试,该组件根据登录状态重定向用户,因此在componentDidMount 中使用next/router 中的router,但出现以下错误:

未找到路由器实例。 您应该只在应用的客户端内使用“next/router”。

在我看来,从 client 端 这意味着使用 routerLink 必须在 render 方法内部使用,因为是什么使得 DOM 和其他方法(如生命周期、钩子和服务器端)在这些情况下不会抛出错误。

我知道测试整个组件胜过单元测试的目的,但我还是想这样做。因此,我关注了这个discussion,看来必须模拟路由器才能被 React-Testing-Library 使用,但没有一个解决方案适合我。

这是我尝试过的代码:

describe('Home Page', () => 
  it('renders without crashing', async () => 
    render(<Home />)
  )
)

【问题讨论】:

【参考方案1】:

使用 next-router-mock 库模拟了路由器。刚刚在测试前粘贴jest.mock('next/router', () =&gt; require('next-router-mock'));,测试通过了。

jest.mock('next/router', () => require('next-router-mock'));
describe('Home Page', () => 
  it('renders without crashing', async () => 
    render(<Home />)
  )
)

虽然测试通过了,但收到这个对我来说没有任何意义的警告。

 › 1 snapshot obsolete.
   • Home Page renders without crashing 1
Snapshot Summary
 › 1 snapshot obsolete from 1 test suite. To remove it, press `u`.
   ↳ tests/homePage.test.js
       • Home Page renders without crashing 1

假设有更好的方法来模拟路由器。

【讨论】:

以上是关于使用 React-testing-library 进行测试时出现 Next.js 路由器错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React-Testing-Library 测试 mapDispatchToProps?

如何使用 Jest 和 react-testing-library 测试 useRef?

react-testing-library - 屏幕与渲染查询

如何使用 react-testing-library 测试由其他组件组成的组件?

使用 react-testing-library 时如何测试组件是不是使用正确的道具呈现?

使用 react-testing-library 时找不到带有文本的元素:“myText”错误