【发布时间】:2020-11-01 11:39:18
【问题描述】:
我正在尝试使用 Jest、Enzyme for useEffect 和 useCallback for React hooks 编写单元测试用例,但我无法成功。你能帮我为下面的代码写一个测试用例吗?
ModalComponent.jsx
const ModalComponent = ({ closeModal }) => {
const handleModal = useCallback((event) => {
if (event.keyCode === 27) {
closeModal(false);
}
}
useEffect(() => {
document.addEventListener('keydown', handleModal);
return () => document.removeEventListener('keydown', handleModal);
}, []);
return (
<Modal>
<Header onClose={closeModal} />
<Body />
<Footer />
</Modal>
);
}
ModalComponent.spec.jsx
describe('Modal Component', () => {
let props;
beforeEach(() => {
props = {
closeModal: jest.fn(),
};
};
it('should handle useEffect', () => {
jest.spyOn(React, 'useEffect').mockImplementation(f => f());
document.addEventListener('keydown', handleModal);
document.removeEventListener('keydown', handleModal);
const component = shallow(<ModalComponent />);
});
});
无法覆盖document.addEventListener('keydown', handleModal);、document.removeEventListener('keydown', handleModal);、if(event.keyCode === 27)、closeModal(false) 这些行。如何覆盖测试用例?
【问题讨论】:
-
Hooks 不是为了测试实现而设计的。测试行为。
-
@EstusFlask,我能够通过模拟 useEffect 和 useCallback 得到这个测试用例。
jest.spyOn(React, 'useEffect').mockImplementation(f => f()); -
有可能,但这不是通常的做法。你不应该在没有充分理由的情况下模拟框架本身,这可能会导致纯粹的合成测试不符合现实世界的期望。这尤其适用于钩子。测试这一点的正确方法是触发
keydown事件,或至少 spy/mockdocument方法并断言它们的调用。 -
@EstusFlask 我该怎么做。如果你能提供一个非常有用的例子。我提到了您在上述评论中提到的链接,他们找到了元素并模拟了类似
wrapper.find('input').simulate('keypress', {key: 'Enter'})的事件,但在我的情况下,我无法将输入或任何其他元素传递给find方法,所以你能指导我吗得到这份工作?
标签: reactjs jestjs react-hooks enzyme