Storybook JS Взаимодействие с ферментом - изменения состояния перевешиваются - PullRequest
0 голосов
/ 02 июня 2018

Я использую сборник рассказов для визуализации изменений компонентов React после моделирования взаимодействия пользователя с ферментом.В качестве небольшого примера я хочу, чтобы история отображала компонент после нажатия одной из его кнопок.

Проблема, с которой я столкнулся, заключается в том, что конструктор компонента вызывается дважды: один раз, когда компонент монтируется ферментом изатем после того, как сборник рассказов отобразит компонент.Это возвращает компонент в его состояние по умолчанию, поэтому любые изменения после имитации взаимодействия с пользователем теряются.

Вот некоторый код, показывающий проблему.После загрузки истории компонент кнопки находится в состоянии «без щелчка», несмотря на то, что щелчок имитировался с помощью фермента:

import React from 'react';

class SampleComponent extends React.Component {

    constructor(props){
        super(props);
        console.log('constructor');

        this.state = {isClicked: false};
        this.onClick = this.onClick.bind(this);
    }

    onClick(){
        console.log('onClick');
        this.setState({isClicked: true});
    }

    render(){
        const text = (this.state.isClicked)? 'Clicked!' : 'Not Clicked';
        return (
            <div>
                <input type='button' value='Click' onClick={this.onClick} />
                <p>{text}</p>
            </div>
        );
    }
}

export default SampleComponent;

Файл истории:

import React from 'react';
import { storiesOf } from '@storybook/react';
import { mount } from 'enzyme';
import { specs, describe, it } from 'storybook-addon-specifications';
import SampleComponent from '../src/SampleComponent';

storiesOf('SampleComponent', module)
    .add('clicked', () => {

        const comp = <SampleComponent/>;
        specs(() => describe('clicked', function () {
            it('Should display clicked state message', function () {
                const output = mount(comp);
                output.find('input').simulate('click');
            });
        }));

        return comp;
    });

Выходные данные дляконсоль будет:

constructor
onClick
constructor

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Вам необходимо вернуть экземпляр базового компонента.Это будет делать то, что вы хотите:

storiesOf('SampleComponent', module)
  .add('clicked', () => {
    let output;

    specs(() => describe('clicked', function () {
      it('Should display clicked state message', function () {
        output = mount(<SampleComponent />);
        output.find('input').simulate('click');
      });
    }));

    const Inst = () => output.instance();
    return <Inst />
  });
0 голосов
/ 25 ноября 2018

Я пытался использовать раскадровку и симуляцию («щелчок») и столкнулся с похожими проблемами.Я бы никогда не увидел состояние после нажатия на панели сборника рассказов.Я понял, что mount (comp) переводит комп в отдельный DOM, а не тот, который использует сборник рассказов.Когда вы возвращаете comp, comp отображается в браузере, и это то, что вы видите.Это может быть проблема конфигурации, которую я не понял.Я использую конфигурацию веб-пакета, описанную в https://www.npmjs.com/package/storybook-addon-specifications#using-enzyme

Это делает то, что вы пытаетесь сделать, без использования фермента:

storiesOf('SampleComponent', module)
.add('clicked', () => {
    const comp = <SampleComponent/>;
    setTimeout(()=>{        // let Storybook render comp and then come back
        let input=document.getElementsByTagName('input')[0];
        input.click(); // browser simulated click
        specs(() => describe('clicked', function () {
            it('Should display clicked state message', function () {
                let p=document.getElementsByTagName('p')[0];
                return (p.innerText==='Clicked!')
            });
        }))
    },1000) // the timeout could be 0 for faster test execution, but 1000 millisecond gives you a change to see that the click takes place
    return comp;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...