reactjs - 如何使用 react-redux 钩子测试组件?
问题描述
我有一个简单的 Todo 组件,它利用了我正在使用酶测试的 react-redux 钩子,但我得到一个错误或一个带有浅渲染的空对象,如下所述。
使用 react-redux 的钩子测试组件的正确方法是什么?
Todos.js
const Todos = () => {
const { todos } = useSelector(state => state);
return (
<ul>
{todos.map(todo => (
<li key={todo.id}>{todo.title}</li>
))}
</ul>
);
};
Todos.test.js v1
...
it('renders without crashing', () => {
const wrapper = shallow(<Todos />);
expect(wrapper).toMatchSnapshot();
});
it('should render a ul', () => {
const wrapper = shallow(<Todos />);
expect(wrapper.find('ul').length).toBe(1);
});
v1 错误:
...
Invariant Violation: could not find react-redux context value;
please ensure the component is wrapped in a <Provider>
...
Todos.test.js v2
...
// imported Provider from react-redux
it('renders without crashing', () => {
const wrapper = shallow(
<Provider store={store}>
<Todos />
</Provider>,
);
expect(wrapper).toMatchSnapshot();
});
it('should render a ul', () => {
const wrapper = shallow(<Provider store={store}><Todos /></Provider>);
expect(wrapper.find('ul').length).toBe(1);
});
v2 测试也失败,因为wrapper
is<Provider>
和调用dive()
将wrapper
返回与 v1 相同的错误。
在此先感谢您的帮助!
解决方案
模拟 useSelector 使用可以做到这一点
import * as redux from 'react-redux'
const spy = jest.spyOn(redux, 'useSelector')
spy.mockReturnValue({ username:'test' })
推荐阅读
- laravel - Eloquent SELECT "string" AS content_type 导致错误
- php - php中的支付api多维数组问题
- powershell - 正则表达式匹配上的Powershell替换字符串
- python - 如何将 Pyomo 变量中的结果导出到 Pandas 数据框和 Excel?
- ios - 用于 Firebase 应用内消息的 Flutter 包不是为 ios 构建的
- docker - 将在主机端口上运行的应用程序暴露给 Selenoid
- r - R - 每个文档的文章之间的相关性
- opencascade - 在 opencascade 中对 TopoDS_Edge 对象进行分类
- linux - Pi4 中的 ros_astra_camera 安装错误(未定义的参考错误)
- javascript - 如何在不使用库的情况下创建 PDF 文件?