【发布时间】:2021-03-18 20:16:06
【问题描述】:
我有一个父组件和一个子组件。
父组件:
const ParentComponent = () => {
const click_button = (role) => {
document.getElementById(role).innerHTML = role;
}
return (
<div>
<ChildButton id= 'button_child' name='button_1' onClick={() => {
click_button('role_1')
}}/>
<div>
<p id="role_1"/>
<p id="role_2"/>
<p id="role_3"/>
</div>
</div>
)
}
export default ParentComponent;
子组件
import React from 'react';
const ChildButton = (props) => {
return (
<React.Fragment>
<button onClick={props.onClick}>{props.name}</button>
</React.Fragment>
)
}
export default ChildButton;
ParentComponent 的测试之一:
it('buttons should render correctly', () => {
const wrapper shallow(<ParentComponent/>);
const instance = wrapper.instance();
jest.spyOn(instance, 'click_button');
expect(instance.click_button).toHaveBeenCalledTimes(0);
wrapper.find('#button_child').simulate('click');
expect(instance.click_button).toHaveBeenCalledTimes(1);
});
我的应用程序使用 jest 和酶进行测试。示例中的点击功能需要在 ParentComponent 中进行测试。但是,当我尝试访问该按钮时,测试失败,这是因为该按钮位于 childButton 组件中。
所以基本上我的任务是如何测试ParentComponent 中的click_button 函数?
上面的例子是空的,酶文档说会是这样。现在我看到人们解决这个问题的唯一方法是“观察”控制台日志,这对我来说似乎有点 hacky?
我试图坚持使用 Enzyme 和 Jest,因为这是我编写单元测试的内容,我希望我的集成测试也能效仿。
感谢您的帮助。
【问题讨论】:
-
如果你是“集成”一起测试父子,为什么要shallow渲染呢?而且您不应该监视任何东西 - 测试的期望应该是更新相关元素内容。
-
“我想知道 click_button 函数已被调用” - 不,你没有。这在单独测试 Child 时可能是有意义的,您检查作为 prop 传递的函数是否被调用,但是当一起测试 Parent 和 Child 时,您希望检查 Parent 实现正确的行为。
click_button是一个实现细节,它甚至在函数之外都无法访问。 -
好吧,我说错了。我应该如何准确测试 click_button ?谢谢
-
再次测试行为。当它被点击时,DOM 应该被更新(虽然这不是 React 的做法),所以测试一下。
标签: javascript reactjs testing jestjs enzyme