Не удалось вызвать setState для React 16 при тестировании с ферментом 3 - PullRequest
0 голосов
/ 15 мая 2018

Я только что обновил фермент 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>
            );

        }

    }
}

1 Ответ

0 голосов
/ 15 мая 2018

Вместо прямого вызова функции onClick вы можете использовать функцию API фермента simulate(), чтобы активировать события щелчка

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