【发布时间】:2019-11-11 14:47:18
【问题描述】:
我有一个简单的 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 是 <Provider> 并且在 wrapper 上调用 dive() 将返回与 v1 相同的错误。
提前感谢您的帮助!
【问题讨论】:
-
你有没有想过这个问题?迁移到 Redux 挂钩后,我遇到了同样的问题。
-
这似乎是 Enzyme 的一个问题,但到目前为止,使用浅层渲染器似乎没有任何适当的解决方法。更好的钩子支持应该在下一个 Enzyme 版本中:github.com/airbnb/enzyme/issues/2011
-
使用 mount 而不是 shallow,因为 shallow 只渲染根组件并按原样放置自定义子组件
标签: reactjs testing redux react-redux enzyme