reactjs - NextJS Router & Jest:如何模拟路由器更改事件
问题描述
我正在使用next-routes
并且在我的 React 组件中我使用下面useEffect
的代码块来检测Router
更改事件:
useEffect(() => {
// THIS BLOCK WILL BE EXECUTED WHEN THE COMPONENT IS ALREADY MOUNTED AND SCREEN WOULD BE REDNDERED IN WHEN ROUTED CLIENT SIDE
const handleRouterChangeComplete = url => {
// console.log('INNNN handleRouterChangeComplete url = ', url);
// MY REST OF THE LOGIC HERE
};
// THIS BLOCK WILL BE EXECUTED WHEN THE SCREEN WOULD BE REDNDERED IN WHEN ROUTED CLIENT SIDE
Router.events.on('routeChangeComplete', handleRouterChangeComplete);
return () => {
Router.events.off('routeChangeComplete', handleRouterChangeComplete);
};
}, []);
我正在jest
为此组件编写单元测试用例并面临以下错误:
TypeError: Cannot read property 'on' of undefined
183 |
184 | // THIS BLOCK WILL BE EXECUTED WHEN THE SCREEN WOULD BE REDNDERED IN WHEN ROUTED CLIENT SIDE
> 185 | Router.events.on('routeChangeComplete', handleRouterChangeComplete);
有人可以帮我嘲笑这个Router Change
事件吗?谢谢
解决方案
对于任何坚持在 nextjs 中测试路由器更改事件的人来说,这里是一个示例。
简答
您可以使用Router.events.emit
从测试中发出事件,然后断言您期望被触发的回调。
长答案
以下是我在示例中使用的场景,但是您可以根据需要对其进行修改。
场景:在我的主应用程序中,我使用NProgress显示每个路线更改的进度条。自定义应用看起来像这样
import Router from 'next/router';
import NProgress from 'nprogress';
Router.events.on('routeChangeStart', () => NProgress.start());
Router.events.on('routeChangeComplete', () => NProgress.done());
Router.events.on('routeChangeError', () => NProgress.done());
export default CustomApp() {
...
}
现在,在我的测试中,我想测试回调是否被正确调用。开玩笑的测试如下所示:
import Router from 'next/router;
import NProgress from 'nprogress;
import { render } from '@testing-library/react';
import CustomApp from 'pages/_app';
const mockStart = jest.spyOn(NProgress, 'start');
const mockDone = jest.spyOn(NProgress, 'done');
it('starts nprogress on router change start', () => {
render(<CustomApp />)
Router.events.emit('routeChangeStart');
expect(mockStart).toHaveBeenCalled();
});
it('ends nprogress on router change complete', () => {
render(<CustomApp />)
Router.events.emit('routeChangeComplete');
expect(mockDone).toHaveBeenCalled();
});
推荐阅读
- javascript - 如何获取表格的所有行并将其显示在警报消息中?
- python - Python api 发布请求
- javascript - 正则表达式捕获位填充
- typescript - 找不到模块“C:\native\win32\x64\12.13.0\edge_nativeclr”
- javascript - 当 playlist.m3u8 文件不断更新时,如何播放 HLS 流?
- python-3.x - 根据行值和行值总和为零在熊猫中创建新列
- jquery - 如何在 ajax 中启用和禁用背景静态模式
- javascript - VUEJS 使用 comment.post_id 和 post.id 为发布社交网络循环评论 我的数据库是 mysql 循环的解决方案是什么?
- python - python中的Alpha-Beta修剪算法不修剪
- java - 创建一个新节点并将对象 bean 放在它下面 java magnolia