【问题标题】:Invariant Violation: ReactShallowRenderer render()不变违规:ReactShallowRenderer render()
【发布时间】:2016-01-26 10:53:47
【问题描述】:

我正在为以下 reactjs 文件编写 unitTest 脚本。

export default class Collapsible extends React.Component {
    static propTypes = {
        title: React.PropTypes.string,
        children: React.PropTypes.any,
    };

    render() {
        const { title } = this.props;
        return (
            <details>
                <summary>{title}</summary>
                {this.props.children}
            </details>
        );
    }
}

按照这里的 uniTest 示例,我虽然可以像下面那样做。

import React from 'react'
import expect from 'expect'
import {createRenderer} from 'react-addons-test-utils'
import {Collapsible } from '../Collapsible.js'

describe('Collapsible', ()=>{
    it('works', ()=>{
        let renderer = createRenderer();
        renderer.render(<details><summary>Title</summary>Text</details>);
        let actualElement = renderer.getRenderOutput();
        let expectedElement = (<details><summary></summary></details>);
        expect(actualElement).toEqual(expectedElement);                     
    });
});

但是,当我运行我的测试时,我得到了错误

Invariant Violation: ReactShallowRenderer render(): 浅渲染 仅适用于自定义组件,不适用于原语(细节)。反而 调用.render(el) 并检查渲染输出,看看 而是直接el.props

请问我哪里出错了?我如何为上面的脚本编写 unitTest。 ?任何帮助将不胜感激。

更新

import React from 'react'
import expect from 'expect'
import {createRenderer} from 'react-addons-test-utils'
import {Collapsible } from '../Collapsible.js'

describe('Collapsible', ()=>{
    it('works', ()=>{
        let renderer = createRenderer();
        renderer.render(<Collapsible title="MyTitle"><span>HEllo</span></Collapsible>);
        let actualElement = renderer.getRenderOutput();
        let expectedElement = (<details><summary></summary></details>);
        expect(actualElement).toEqual(expectedElement);                     
    });
});

当我运行上面的代码时,我得到了

无法读取 undefined 的属性“propTypes”。我猜可能是我必须传递 title 和 props.children ,因为它们是 Collapsible 中的属性。请问怎么做?

【问题讨论】:

    标签: unit-testing reactjs


    【解决方案1】:

    您没有在测试中使用 Collapsible 元素,这就是您收到该错误的原因。

    使用任何原始元素(基本上是任何 HTML 标记)都会收到错误消息,您只能将自己的组件传递给 Shallow 渲染器。

    renderer.render(<Collapsible />);
    

    【讨论】:

    • 安德森感谢您的回复,您的观点很有道理。但是,现在我遇到了错误 Cannot read property 'propTypes' of undefined 。我猜是因为我的 {title} 和来自 Collapsible 的 {this.props.children} 尚未设置。请问我如何在上面的答案中传递这些属性?
    • 您能否粘贴您尝试运行的代码。我刚刚在上面复制/粘贴了您的代码,它可以运行 OOTB。
    • @Anderson,请原谅我的问题,我对此很陌生。请根据您的回答更新我的问题。请问为什么会抛出上面的错误?。
    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 2020-05-06
    • 2020-03-20
    • 2021-11-07
    • 2018-12-13
    • 1970-01-01
    • 2022-10-18
    • 2015-11-14
    相关资源
    最近更新 更多