【问题标题】:Could not call setState for React 16 when testing with enzyme 3使用酶 3 进行测试时无法为 React 16 调用 setState
【发布时间】:2018-10-25 03:05:29
【问题描述】:

我刚刚升级了酶 3 和反应 16。我的测试之前工作正常。现在它失败了。以下是说明。

我的应用正在使用:

react@16.2.0
jsdome@^11.10.0
enzyme@^3.3.0

这是我的测试:

it('should show real numbers on click', () => {
    // at beginning, it shows some masked value
    expect(wrapper).to.contain
        .text(MASKED);
    // trying to do a click on the element
    let maskedElem = wrapper.find('.masked');
    maskedElem.prop('onClick')();

    // expecting it to have a new value
    expect(wrapper).to.contain
        .text(VALUE);
});

maskedElem.prop('onClick')(); 失败了。

这是错误堆栈。

 Error: An error was thrown inside one of your components, but React doesn't know what it was. This is likely due to browser flakiness. React does its best to preserve the "Pause on exceptions" behavior of the DevTools, which requires some DEV-mode only tricks. It's possible that these don't work in your browser. Try triggering the error in production mode, or switching to a modern browser. If you suspect that this is actually an issue with React, please file an issue.
  at Object.invokeGuardedCallbackDev (node_modules/react-dom/cjs/react-dom.development.js:586:19)
  at invokeGuardedCallback (node_modules/react-dom/cjs/react-dom.development.js:438:27)
  at renderRoot (node_modules/react-dom/cjs/react-dom.development.js:10366:7)

这是我正在测试的组件。

class Phone extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            clicked: false
        };
    }

    onClick() {
        this.setState({
            ...this.state,
            clicked: true
        })
    }
    render() {
        if (this.state.clicked) {
            return (
                <span>{this.props.value}</span>
            );
        } else {
            return (
                <span onClick = {() => this.onClick()}
                className='masked'>
                    {MASKED}
                </span>
            );

        }

    }
}

【问题讨论】:

    标签: reactjs enzyme jsdom


    【解决方案1】:

    您可以使用酶 API 函数 simulate() 来激活您的点击事件,而不是直接调用 onClick 函数

    // trying to do a click on the element
    let maskedElem = wrapper.find('.masked');
    maskedElem.simulate('click);
    

    【讨论】:

    • 试过了。仍然是同样的错误:错误:在您的一个组件中抛出了一个错误,但 React 不知道它是什么。这可能是由于浏览器的脆弱性。 React 尽最大努力保留 DevTools 的“异常暂停”行为,这需要一些仅 DEV 模式的技巧。这些可能在您的浏览器中不起作用。尝试在生产模式下触发错误,或切换到现代浏览器。如果你怀疑这实际上是 React 的问题,请提出问题。
    • 这表明破坏的不是你的测试,而是你的组件中的某些东西
    • 该错误可能与您实例化测试的方式有关。您能否在测试中发布创建wrapper 元素的部分?
    • 我在升级到反应 16、酶 3 和 jsdom 时仍然遇到错误。但是我可以确认这个错误是由于 jsdom 的配置造成的。特别是,这是因为 HTMLElement 在 jsdom 的全局范围内不可用(我之前使用的是 node-jsdom)
    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 2019-04-21
    • 2022-01-22
    • 2016-12-07
    • 2021-06-04
    • 1970-01-01
    • 2018-06-14
    • 2018-12-17
    相关资源
    最近更新 更多