使用 Enzyme 进行 Storybook JS 集成测试 - 状态更改被覆盖
Posted
技术标签:
【中文标题】使用 Enzyme 进行 Storybook JS 集成测试 - 状态更改被覆盖【英文标题】:Storybook JS Interaction Testing with Enzyme - State Changes being Overidden 【发布时间】:2018-11-12 13:01:55 【问题描述】:在模拟用户与酶的交互后,我正在使用故事书来可视化 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
【问题讨论】:
【参考方案1】:您需要取回底层组件实例。这会做你想做的事:
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 />
);
【讨论】:
【参考方案2】:我一直在尝试使用故事板和模拟('click')并遇到类似的问题。我永远不会在故事书窗格中看到单击后的状态。我发现 mount(comp) 正在将 comp 渲染到一个单独的 DOM 中——而不是故事书使用的那个。当您返回 comp 时,comp 会在浏览器中呈现,这就是您所看到的。这可能是我还没有弄清楚的配置问题。我正在使用https://www.npmjs.com/package/storybook-addon-specifications#using-enzyme
中描述的 webpack 配置这可以通过不使用酶来完成您正在尝试做的事情:
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;
);
【讨论】:
以上是关于使用 Enzyme 进行 Storybook JS 集成测试 - 状态更改被覆盖的主要内容,如果未能解决你的问题,请参考以下文章
如何将使用 Enzyme.js 渲染的组件传递给 props?
如何在 Laravel-Vue.js 应用程序中使用 Storybook
如何使 Storybook 插件“插件链接”适用于 Vue.js?
如何使用 Next.js、Ant Design、Less 和 TypeScript 配置 Storybook.js Webpack