【发布时间】:2020-09-05 20:22:23
【问题描述】:
我正在使用 Jest & Enzyme 测试一个 React 应用程序。当我运行npm run test 时,我在UserContext.jsx 中得到错误,该错误是在MainPage.jsx 中导入的。我该如何解决?
错误信息
Invariant Violation:无效的钩子调用。 Hooks 只能在函数组件的主体内部调用。这可能由于以下原因之一而发生: 1. React 和渲染器的版本可能不匹配(例如 React DOM) 2. 你可能违反了 Hooks 的规则 3. 你可能在同一个应用中拥有多个 React 副本
11 | };
12 |
> 13 | export const useUserValue = () => useContext(UserContext);
| ^
UserContext.jsx
import React, {createContext, useContext, useReducer} from "react";
export const UserContext = createContext();
export const UserProvider = ({reducer, initialState, children}) => {
return(
<UserContext.Provider value={useReducer(reducer, initialState)}>
{children}
</UserContext.Provider>
)
};
export const useUserValue = () => useContext(UserContext);
MainPage.test.js
import React from 'react';
import 'jest-styled-components';
import { configure, shallow, mount } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import MainPage from "./MainPage";
import {useUserValue} from "../Context/UserContext";
configure({adapter: new Adapter()});
describe('Main Page Component', () => {
it('exists', () => {
const wrapper = shallow(<MainPage />, {context: useUserValue()});
expect(wrapper).toMatchSnapshot();
});
});
MainPage.jsx
import React, {useEffect, useState} from 'react';
import {useUserValue} from "../Context/UserContext";
export default function MainPage(props) {
const [{ user }, dispatch] = useUserValue();
return (
<React.Fragment>
{user.name}
</React.Fragment>
);
}
【问题讨论】: