【发布时间】:2021-06-19 09:16:08
【问题描述】:
我有一个功能性的 React 组件,它呈现一个按钮,当单击该按钮时,会使用传递的参数从 props 调用 handleSave 函数。我尝试用测试覆盖组件,但我无法获胜,测试在控制台中崩溃,并出现未调用函数的错误。附上组件和测试代码:
// component
function Modal(props) {
const { handleSave } = props;
return (
<button onClick={() => {handleSave('someInfo')}}>Save</button>
)
}
// test
describe('ModalComponent', () => {
it('should call handleSave function', () => {
const onSaveClickMock = jest.fn();
const component = mount(<Modal handleSave={onSaveClickMock} />);
const button = component.find('button');
button.simulate('click');
expect(onSaveClickMock).toHaveBeenCalled();
})
})
据我了解,如果将 handleSave 函数像这样直接传递给 onClick,则此测试实现将起作用:
<button onClick={handleSave}>Save</button>
当函数不只是传递给 onClick 属性,而是使用传递的参数调用时,如何实现测试?
【问题讨论】:
-
你测试它完全一样。从测试的角度来看,重要的是
handleSave在正确的时间使用正确的参数被调用;例如,无论是onClick={callback}还是onClick={event => callback(event)}都没有关系。如果该测试未通过,则可能单击了其他按钮 - 对于此特定 minimal reproducible example,测试是否失败? -
是的,但在这种情况下,另一种方法 (toHaveBeenCalledWith()) 确实有帮助。不过还是谢谢
-
您说 .toHaveBeenCalled 失败是因为根本没有调用该函数,那么如何通过使用特定参数调用它来测试它?
标签: javascript reactjs unit-testing jestjs enzyme