"Could not find store" 在 Jest 中使用上下文提供程序包装组件后
"Could not find store" after wrapping component with context provider in Jest
用适当的提供程序包装 React 组件后,在 jest 测试环境中仍然找不到商店。有没有我遗漏的东西,或者其他更简洁的方法?
这是适用于其他商店的做法,我已经与其他组件一起使用过,所以我看不出为什么这不起作用。渲染器应该创建一个用 TextContext 包裹的对象,它需要从中读取以填充字段。
上下文
import { connect } from 'react-redux';
import React, { createContext } from 'react';
export const TextContext = createContext({});
export function TextProvider({ children, text }) {
return <TextContext.Provider value={text}>{children}</TextContext.Provider>;
}
export const TextConsumer = TextContext.Consumer;
function renderComposition(props) {
const text = {
... // some text objects
};
return (
<TextProvider text={text}>
<Composition {...props} />
</TextProvider>
);
}
目标失败行
beforeEach(() => {
...
subject = mount(renderer.create(renderComposition(props)));
...
)};
错误为
Invariant Violation: Could not find "store" in either the context or props of "Connect(Composition)". Either wrap the root component in a <Provider>, or explicitly pass "store" as a prop to "Connect(Composition)".
我想您的组件需要模拟商店,您可以通过创建 mockReduxState.js
来提供它
import configureMockStore from "redux-mock-store";
export const createMockStore = state => configureMockStore()(state);
通过 mockedStore 更新失败的测试。
beforeEach(() => {
...
let updatedProp = {...props, store:createMockStore};
subject = mount(renderer.create(renderComposition(updatedProp)));
...
)};
事实证明问题无关,我导入的是组件而不是连接的容器,因此从未设置商店。事实证明,名字是成功的一半。模拟商店选项也是处理此问题的好方法,感谢 paragxvii
用适当的提供程序包装 React 组件后,在 jest 测试环境中仍然找不到商店。有没有我遗漏的东西,或者其他更简洁的方法?
这是适用于其他商店的做法,我已经与其他组件一起使用过,所以我看不出为什么这不起作用。渲染器应该创建一个用 TextContext 包裹的对象,它需要从中读取以填充字段。
上下文
import { connect } from 'react-redux';
import React, { createContext } from 'react';
export const TextContext = createContext({});
export function TextProvider({ children, text }) {
return <TextContext.Provider value={text}>{children}</TextContext.Provider>;
}
export const TextConsumer = TextContext.Consumer;
function renderComposition(props) {
const text = {
... // some text objects
};
return (
<TextProvider text={text}>
<Composition {...props} />
</TextProvider>
);
}
目标失败行
beforeEach(() => {
...
subject = mount(renderer.create(renderComposition(props)));
...
)};
错误为
Invariant Violation: Could not find "store" in either the context or props of "Connect(Composition)". Either wrap the root component in a <Provider>, or explicitly pass "store" as a prop to "Connect(Composition)".
我想您的组件需要模拟商店,您可以通过创建 mockReduxState.js
import configureMockStore from "redux-mock-store";
export const createMockStore = state => configureMockStore()(state);
通过 mockedStore 更新失败的测试。
beforeEach(() => {
...
let updatedProp = {...props, store:createMockStore};
subject = mount(renderer.create(renderComposition(updatedProp)));
...
)};
事实证明问题无关,我导入的是组件而不是连接的容器,因此从未设置商店。事实证明,名字是成功的一半。模拟商店选项也是处理此问题的好方法,感谢 paragxvii