首页 > 其他分享 >快速提示:toBeDefined 与否。toBeDefined?这就是问题:处理常见的 Jest 误报。

快速提示:toBeDefined 与否。toBeDefined?这就是问题:处理常见的 Jest 误报。

时间:2022-09-18 03:44:17浏览次数:102  
标签:期望 测试 误报 toBeDefined Jest 组件 ChildComponent find

快速提示:toBeDefined 与否。toBeDefined?这就是问题:处理常见的 Jest 误报。

当您断言子组件的存在时,特别是在 Enzyme 中,很容易想要做这样的事情:

 常量渲染=浅(<Component showChildComponent /> ) //这将返回子组件  
 const childComponent = render.find(ChildComponent) // ✅ 这个断言通过了!  
 期望(rendered.find(ChildComponent)).toBeDefinded()

ChildComponent 存在,并且测试按您认为的方式通过。

但是,如果您现在编写反向断言以确保 ChildComponent 也可以被隐藏,这将有所帮助。

你可能会得到你刚刚写的最自然的逆:

 常量渲染=浅(<Component showChildComponent={false} /> ) //这返回null  
 const childComponent = render.find(ChildComponent) // ❌ 这个断言失败。  
 期望(rendered.find(ChildComponent)).not.toBeDefinded() // ❌ 这也失败了。  
 期望(rendered.find(ChildComponent)).toBeUnDefinded()

不幸的是,您过去可能在这种情况下浪费了大量时间。或者可能 ** 你现在,** 这就是你阅读这篇文章的原因。

如果您仔细查看刚刚调用的方法名称,这些失败就会开始变得更有意义。

名字 被定义为 试图告诉我们。虽然它的名字听起来很笼统,但它的用途相对狭窄。

它试图告诉你:

“我只关心事物与价值的关系 不明确的 ”。

我们可以用伪代码写出我们的断言来说明幕后发生的测试:

 //tobe未定义  
 如果(空===未定义){返回真} //被定义为  
 如果(空!==未定义){返回真} //not.toBeDefined...简化  
 如果(空===未定义){返回真}

顺便说一句,你会发现自己经常遇到这种情况:

 它('空',()=> { 常量 n = 空; 期望(n).toBeNull(); 期望(n).toBeDefined(); 期望(n).not.toBeUndefined(); 期望(n).not.toBeTruthy(); 期望(n).toBeFalsy(); });

这些都通过了。

真正的可怕

好的,所以你犯了一个简单的错误并使用了错误的方法。

您因失败的测试而沮丧了几分钟(或几小时) 知道 应该通过。

但是,这里最可怕的是您编写的第一个测试。

以出色的成绩通过的那一个:

 const ChildComponent = () => <span>Child</span>  
 const 组件 = (props) => (  
 <div>  
 {props.showChildComponent && (  
 <ChildComponent />  
 )}  
 </div>  
 ) 常量渲染=浅(<Component showChildComponent /> ) // ✅ 像我们认为的那样通过。  
 期望(rendered.find(ChildComponent)).toBeDefinded()

写完之后,你会想:好的,太好了,现在我们有了测试覆盖率。如果我们弄乱了我们的组件显示和隐藏 ChildComponent 的能力,这个测试将捕获它。正确的?

让我们来测试一下。

假设我们不小心修改了父组件:

 常量组件 = () => (  
 <div>  
 {props.showComponent === 'showMe' && (  
 <ChildComponent />  
 )}  
 </div>  
 )

现在 显示组件 道具必须相等 给我看看 显示。

让我们再次运行测试:

 常量渲染=浅(<Component showComponent /> ) // ✅ 这仍然通过。  
 期望(rendered.find(ChildComponent)).toBeDefinded()

A twist ending.

不! 我们一开始就非常小心地编写这些测试!

现在你还记得以前的学习者:
render.find(ChildComponent) = null //true

因此:

 render.find(ChildComponent) !== undefined //true  
 //或者  
 null !== 未定义 //true

这意味着您的断言是正确的,并且您的测试通过了,尽管您的组件现在被破坏了。这是令人不寒而栗的东西!

擦掉脸上的冷汗,然后查看测试套件。

您可能会对实际有多少误报感到惊讶。

The Sky is, indeed, possibly falling.

额外提示 1 — toBeInTheDocument
我们的误报在 React 测试库中变得不那么真实了,在那里您可以使用专用的断言来测试组件的存在: 进入文档。

但是,使用错误的方法不仅仅是与在树中查找 React 组件相关的问题。您仍然希望将这些基本的 Jest 断言用于诸如 prop 值或测试钩子之类的事情,所以要小心。

**额外提示 2 — 花点时间。
** 当我们匆忙或上下文切换回我们编写测试时,通常会发生此类问题。

被定义为 不如最初听起来那么普遍。然而,它的目的更狭窄,而且完全是关于我们的 JS 价值 不明确的 .

因此,请稍等一下,下次阅读该方法名称。甚至可能是您正在使用的系统的文档!

**额外提示 2 — 替代断言
** 那么,您如何可靠地在 Enzyme 中进行测试呢?

尝试测试长度:

 //如果你认为它应该在那里  
 期望(find(ChildComponent).length).toBe(1) //和 //如果你认为它不应该在那里  
 期望(find(ChildComponent).length).toBe(0)

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

本文链接:https://www.qanswer.top/37462/27171803

标签:期望,测试,误报,toBeDefined,Jest,组件,ChildComponent,find
From: https://www.cnblogs.com/amboke/p/16704123.html

相关文章