首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖酶状态变化的Storybook JS交互测试

覆盖酶状态变化的Storybook JS交互测试
EN

Stack Overflow用户
提问于 2018-06-03 01:30:26
回答 2查看 1.4K关注 0票数 13

在模拟用户与酶的交互后,我正在使用storybook可视化React组件的更改。作为一个小示例,我想要一个故事显示一个组件后,它的一个按钮已被单击。

我遇到的问题是组件的构造函数被调用了两次:一次是组件被酶挂载的时候,另一次是storybook显示组件的时候。这会将组件恢复到默认状态,因此在模拟用户交互之后所做的任何更改都会丢失。

以下是显示该问题的一些代码。在故事加载之后,按钮组件处于“未点击”状态,即使点击是用酶模拟的:

代码语言:javascript
复制
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;

故事文件:

代码语言:javascript
复制
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;
    });

控制台的输出将是:

代码语言:javascript
复制
constructor
onClick
constructor
EN

回答 2

Stack Overflow用户

发布于 2019-01-07 08:18:33

您需要取回底层组件实例。这将完成您想要的操作:

代码语言:javascript
复制
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 />
  });
票数 4
EN

Stack Overflow用户

发布于 2018-11-26 04:36:53

我一直在尝试使用故事板和模拟(‘click’),遇到了类似的问题。我永远不会在故事书窗格中看到单击后的状态。我发现mount( comp )会将comp渲染到一个单独的DOM中--而不是storybook正在使用的那个。当您返回comp时,comp将在浏览器中呈现,这就是您所看到的。这可能是一个配置问题,我还没有弄清楚。我使用的是https://www.npmjs.com/package/storybook-addon-specifications#using-enzyme中描述的webpack配置

这可以做你想做的事情,不需要使用酶:

代码语言:javascript
复制
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;
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50659472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档