迁移到 8 后无法模拟 React-Redux 钩子

kid*_*ney 4 reactjs enzyme react-redux react-hooks

我一直在使用 Enzyme 浅渲染的测试中使用以下模式来模拟 React-Redux 钩子:

import * as redux from "react-readux";
...
jest.spyOn(redux, "useSelector").mockReturnValue(Generator.generateUser());
Run Code Online (Sandbox Code Playgroud)

然而,在迁移到react-redux 8.0.1(从7.2.6)之后,这种模式不再有效,我收到以下错误:

TypeError: Cannot redefine property: useSelector
        at Function.defineProperty (<anonymous>)
Run Code Online (Sandbox Code Playgroud)

我怀疑这与 React-Redux 内部的变化有关(如 8.x 发行说明中所宣布的)。有人对如何克服这个问题有什么建议吗?我尝试将渲染包装在 Provider 中并使用dive()

TypeError: Cannot redefine property: useSelector
        at Function.defineProperty (<anonymous>)
Run Code Online (Sandbox Code Playgroud)

但这会抛出"could not find react-redux context value; please ensure the component is wrapped in a <Provider>". 此外,虽然这对 有所帮助useSelector,但对于模拟来说不太有用useDispatch

小智 11

我有同样的问题

我的解决方案

import * as Redux from "react-redux";

jest.mock("react-redux", () => ({
    ...jest.requireActual("react-redux"),
    useSelector: jest.fn(),
}));

describe("Blabla", () => {
    const mockedState = {
        user: {
            firstname: "John",
        },
    };

    beforeEach(() => {
        Redux.useSelector.mockImplementation((callback) => {
            return callback(mockedState);
        });
    });
});
Run Code Online (Sandbox Code Playgroud)