我有一个React组件,它生成了一个按钮,其内容包含一个像这样的<span>
元素:
function Click(props) {
return (
<button disable={props.disable}>
<span>Click me</span>
</button>
);
}
我想使用react-testing-library
和mocha
+ chai
来测试这个组件的逻辑。
我目前遇到的问题是getByText("Click me")
选择器返回<span>
DOM节点,但对于测试,我需要检查<button>
节点的disable
属性。处理这样的测试用例的最佳实践是什么?我看到了几个解决方案,但它们听起来都有点不对劲:
1.将data-test-id
用于<button>
元素
1.选择<Click />
组件的祖先之一,然后选择按钮within(...)
this scope
1.单击带有fireEvent
的所选元素,并检查是否没有发生任何事情
你能建议一个更好的方法吗?
9条答案
按热度按时间zzwlnbp81#
按钮禁用时声明
您可以使用
toHaveAttribute
和closest
来测试它。或
toBeDisabled
按钮启用时Assert
要检查按钮是否已启用,请按如下方式使用
not
pcrecxhr2#
你可以使用
@testing-library/jest-dom
中的toBeDisabled()
,它是一个自定义的jest matcher,用来测试DOM的状态:https://github.com/testing-library/jest-dom
示例:
qlfbtfca3#
对于正在寻找按钮未禁用的测试的人。
vzgqcmou4#
我会礼貌地说你正在测试一个实现细节,这是react-testing-library不鼓励的。
你的测试越像你的软件的使用方式,它们就能给予你越多的信心。
如果一个按钮被禁用,用户不会看到一个禁用的 prop ,相反,他们看到什么也没有发生。如果一个按钮被启用,用户不会看到一个被禁用的 prop 的遗漏,相反,他们会看到一些事情发生。
我认为你应该测试这个:
ijnw1ujt5#
toHaveAttribute是使用属性的好选择。
希望这会有帮助。
d8tt03nd6#
您可以使用
@testing-library/react
测试按钮的禁用属性,如下所示。例如:
xdyibdwo7#
解决这个问题的另一种方法是按角色抓取并检查innerHTML,如:
对于您的特定情况,这不是最好的解决方案,但如果您必须处理不是实际按钮的按钮组件,则可以将其放在后袋中,例如,
<div role="button"><span>Click Me</span></div>
ulydmbyx8#
我的解决方案,在我看来,这个案件涵盖了什么是必要的。检查按钮已禁用,因此toHaveBeenCalledTimes必须接收0
5q4ezhmt9#
当前答案: