如何在不模拟 useRef() 的情况下测试 useRef()?

如何在不模拟 useRef() 的情况下测试 useRef()?

有时你需要将一些 React 组件的方法暴露给它的父组件 使用命令句柄() 前向引用() .在之前的一篇文章中,我写了关于测试这些公开方法的文章。这次我们来看看父组件。我们如何测试父组件是否真的调用了子组件的方法?

在一个简单的情况下,您可以模拟 使用参考() 并完成它:

 test("应该调用子组件的方法", () => { 常量 mockChildMethod = jest.fn (); 是  
 .spyOn(反应,'useRef')  
 .mockReturnValue({  
 当前的: {  
 childMethod:模拟ChildMethod  
 }  
 }); ...做一些触发子方法的事情... 期望(mockChildMethod).toBeCalled(); });

但是,如果不仅子组件公开方法,而且父组件也公开方法怎么办?在这种情况下,嘲笑 使用参考 导致并发症。

在我的现实生活任务中,我正在测试一个名为 它为导入它的任何组件提供了一系列 UI 功能:对话框、快餐栏、微调器等。显示这些元素的方法暴露给父组件 使用命令句柄() .它的子组件,例如 对话 , 微调器 小吃店 也有类似暴露的方法。我的 组件看起来像这样:

 const Page = forwardRef((props, ref) => { 常量对话框 = useRef(); useImperativeHandle(ref, () => ({ 显示对话框(配置){  
 dialog.current.show(config);  
 } 隐藏对话(){  
 dialog.current.hide();  
 }  
 }); 使成为(  
 <Dialog ref={dialog} />  
 );  
 });

从测试的角度来看,它提出了一个问题。在我的测试中,我正在渲染 像这样:

 const ref = React.createRef();  
 使成为(<Page ref={ref} /> ); ref.current.showDialog();

测试子组件是否 显示对话框() 方法被调用,我应该模拟出来 反应.useRef() 就像第一个例子一样。但是,如果我这样做了, 参考电流 将不再代表 并用我创建的模拟替换它们,模仿的方法 对话 .这将使测试的方法 不可能的。

如何模拟 对话 但不是 ?为此,需要在 .参考资料 对话 应该暴露在 使用命令式句柄 钩。最好使用吸气剂来完成。

 const Page = forwardRef((props, ref) => { 常量对话框 = useRef(); useImperativeHandle(ref, () => ({  
   
 获取 dialogRef() {  
 返回对话框.当前;  
 } 显示对话框(配置){  
 dialog.current.show(config);  
 } 隐藏对话(){  
 dialog.current.hide();  
 }  
 }); 使成为(  
 <Dialog ref={dialog} />  
 );  
 });

现在我们可以模拟出对 对话 并监视方法:

 test("应该打开和关闭一个对话框", () => { const ref = React.createRef();  
 使成为(<Page ref={ref} /> ); const show = jest.spyOn(ref.current.dialogRef, 'show');  
 const hide = jest.spyOn(ref.current.dialogRef, 'hide'); 行动(()=> {  
 ref.current.showDialog();  
 ref.current.hideDialog();  
 }); 期望(显示).toBeCalled();  
 期望(隐藏).toBeCalled();  
 });

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/38660/31242211

posted @ 2022-09-22 11:34  哈哈哈来了啊啊啊  阅读(98)  评论(0编辑  收藏  举报