这个问题已经有几个月了,但如果你还没有找到一个好的解决方案,我写了一个可能有帮助的包。我经历了类似的思考过程,包括“如果我将钩子注入到组件中会怎样?” 事情变得很奇怪。
我基本上想要一个连接器来避免展示组件的额外包装器只是为了测试它们。
我想出了react-hooks-compose
,它可以让您将钩子和演示者分开,并单独或一起测试它们:https : //www.npmjs.com/package/react-hooks-compose
export const useFetch = () => {
const [user, setUser] = useState();
useEffect(() => {
fetchData('some-url') // <-- Fetches data on mount
.then(res => setUser(res.data));
}, []);
return {user};
}
// composeHooks passes the values from your hooks as props
export const UserPresenter = ({user}) => {
return <div>You fetched data for: {user.name}</div>;
}
export default composeHooks({ useFetch })(DataPresenter);
现在您不必模拟钩子,您只需使用props测试演示者:
it('presents user', () => {
const { queryByText } = render(<UserPresenter user={{name: 'Mary'}} />); // <-- Named export
expect(queryByText('Mary')).toBeTruthy();
});
或者,您可以选择更高级别的集成测试:
it('fetches data', () => {
fetchData.mockResolvedValue('Mary');
const { queryByText } = render(<UserWithData />); // <-- Default export
expect(queryByText('Mary')).toBeFalsy();
return wait(() => {
expect(queryByText('Mary')).toBeTruthy();
});
});
如果您愿意,您甚至可以对钩子进行单元测试。