测试期间发生不变违规错误时,反应组件会消耗上下文api中的道具

时间:2018-10-29 10:05:25

标签: reactjs jestjs enzyme react-context

我是开玩笑和酶的新手,在测试使用React上下文API的prop的react组件时,遇到了一些Invariant Violation错误。我熟悉不变违规错误及其可能的原因,但是在这种情况下,我陷入了困境。一些建议是非常感谢。这是一个最小的代码设置,仅用于演示目的。我在跑步
“酶”:“ 3.7.0”, “ enzyme-adapter-react-16”:“ 1.6.0”,
“ jest”:“ 23.6.0”。

注意,下面的代码工作正常,但是,只有在我尝试测试MyComponent.jsx时,麻烦才开始。

index.jsx

import * as React from 'react';
import ReactDOM from 'react-dom';
import MyComponentWithContext from "./MyComponent";

const testValue = 'test value';

export const MyContext = React.createContext(testValue);

const App = () => {
    return (
        <div>
            <MyComponentWithContext/>
        </div>
    )
}

ReactDOM.render(
    <MyContext.Provider value={testValue}>
        <App/>
    </MyContext.Provider>,
    document.getElementById('root') || document.createElement('div')
)

MyComponent.jsx

import * as React from 'react';
import {MyContext} from './';

export class MyComponent extends React.Component {
    constructor(props) {
        super(props)
    }
    getContextValue() {
        return this.props.testValue
    }
    render() {
        return <div>{this.getContextValue()}</div>;
    }
}

const MyComponentWithContext = () => (
    <MyContext.Consumer>
        {testValue => <MyComponent testValue={testValue}/>}
    </MyContext.Consumer>
)

export default MyComponentWithContext;

当我尝试像这样测试MyComponent时:

MyComponent.unit.test.js

import React from 'react';
import {shallow} from 'enzyme';
import {MyComponent} from '../MyComponent';

describe('<MyComponent />', () => {
    const testValue = 'test value';
    it('should return test value', () => {
        const wrapper = shallow(<MyComponent testValue={testValue}/>);
        expect(wrapper.instance().getContextValue()).toEqual(testValue);
    });

});

这给了我以下错误:

不变违规:元素类型无效:预期为字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义。您可能忘记了从定义文件中导出组件,或者可能混淆了默认导入和命名导入。 检查App的渲染方法。

| ReactDOM.render(
         |          ^
      18 |     <MyContext.Provider value={testValue}>
      19 |         <App/>
      20 |     </MyContext.Provider>,

1 个答案:

答案 0 :(得分:0)

ReactDOM.render(...)不应在单元测试中进行评估。模块的组织不当。 index.js 提供了一些副作用,这些副作用应在单元测试中避免,它也与 MyComponent.js 具有不必要的循环依赖关系。

export const MyContext = React.createContext(testValue);

应移至单独的模块,以便组件模块可以直接将其导入。