首页 > 其他分享 >如何在不模拟 useRef() 的情况下测试 useRef()?

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

时间:2022-09-22 11:44:33浏览次数:94  
标签:useRef const 对话框 current 测试 组件 ref 模拟

如何在不模拟 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

标签:useRef,const,对话框,current,测试,组件,ref,模拟
From: https://www.cnblogs.com/amboke/p/16718691.html

相关文章

  • 接口测试的两种方法
    其实无论用那种测试方法,接口测试的原理是通过测试程序模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做出处理然后再把应答报文发送给客户端,客户端接收......
  • 数组模拟环形队列
    简介对前面的数组模拟队列的优化,充分利用数组.因此将数组看做是一个环形的。(通过取模的方式来实现即可)代码实现importjava.util.Scanner;publicclassCir......
  • 一道测试Java值传递的题目
    请给出下列代码的执行结果:publicclassT3{publicstaticvoidmain(String[]args){T3t3=newT3();t3.first();}publicvoidfir......
  • 使用Sql生成测试数据
    无论您是在用原型证明某一概念,还是开发一个全新的应用程序,或者只是学习SQL,您都需要在您的应用程序上运行测试数据。本文讨论了如何生成足够的、对测试有用的、具有期望......
  • 《吐血整理》高级系列教程-吃透Fiddler抓包教程(23)-Fiddler如何优雅地在正式和测试环
    1.简介在开发或者测试的过程中,由于项目环境比较多,往往需要来来回回地反复切换,那么如何优雅地切换呢?宏哥今天介绍几种方法供小伙伴或者童鞋们进行参考。2.实际工作场景2.......
  • 各种模拟器连接android studio
      01、雷电模拟器 3、然后在其中输入你的雷电模拟器安装目录,回车运行。   4、完成后,再输入“adb.execonnect127.0.0.1:5555”回车运行。  02、夜神......
  • CSP-S模拟8
    Cat最喜欢清北营赛制了!但是这个赛制暗示了以下全是鬼畜题…… A.选举居然可以dp,我本来以为是贪心的题,联想到了学长提到的过关得到相应的星星,可以选择拿1颗或两颗,代价......
  • Web安全攻防:渗透测试实战指南 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1YfLeXKh_kaXF1-bwXU28Cw点击这里获取提取码 ......
  • 电源地、模拟地、数字地
     电路板设计时直流电源地、模拟地、数字地如何区分?如何共地?发布时间:2016-05-2311:19 阅读:917 来源:技术文章责任编辑:深圳宏力捷PCB设计部电路板设计时直流电......
  • 跳转连接测试
    跳转连接111111111111111111111111111111111111如下所示:安装......