本文主要是介紹基於React+Ant Design(如下用Antd表示Ant Design)的項目,在對於本身封裝的,或者基於Antd封裝的公共組件的自動化測試技術的選型和實踐。html
當前前端項目愈來愈大,業務邏輯日益繁雜,協同開發的同事也愈來愈多,迭代頻繁,許多頁面有一些類似的功能,會複用一些組件,這些組件被剝離出來,通常放在component
文件夾下,你們共同維護,這時會出現一些常見問題:前端
目前前端總體的測試框架較爲經常使用的有:react
源自Facebook,Jest 的一個理念是提供一套完整集成的 「零配置」 測試體驗。app
僅僅是測試運行器,雖然靈活,但須要本身配置不少東西。框架
綜合目前市面上的輪子,咱們技術選型爲Jest+Enzymedom
例子是一個基於Antd二次封裝的單選年的日期選擇器,以下演示:函數
代碼結構以下性能
其中測試相關的文件,在__test__中,後綴名爲xxx.test.js的文件,在運行測試時會自動執行,__snapshots__爲自動生成的頁面快照。單元測試
這裏能夠首先簡單的看一下,Jest+Enzyme的基本語法:測試
Jest的API更多着力於定義測試、斷言、mock庫
Enzyme的API更多着重於渲染react組件和從dom樹種檢索指定的節點
具體的寫法,index.test.js文件內容以下:
import React, { PureComponent } from 'react'; import { mount, ReactWrapper, render } from 'enzyme'; import YearPicker from '..'; import moment from 'moment'; class YearPickerDemo extends React.Component { state = { cleared: false, value: moment().format('YYYY'), }; render() { return ( <YearPicker showTime format="YYYY" onChange={this.onChange} defaultValue={moment('2015/01/01', 'YYYY')} /> ); } } describe('DatePicker', () => { it('default value', () => { const wrapper = mount(<YearPickerDemo/>); expect(wrapper.find('.ant-calendar-picker-input').getDOMNode().value).toBe('2015'); }); it('clear value', () => { const wrapper = mount(<YearPickerDemo/>); wrapper.find('.ant-calendar-picker-clear').hostNodes().simulate('click'); expect(wrapper.find('.ant-calendar-picker-input').getDOMNode().value).toBe(''); }); it('set value in calendar', () => { const wrapper = mount(<YearPickerDemo/>); wrapper.find('.ant-calendar-picker-input').simulate('click'); const triggerWrapper = mount(wrapper.find('Trigger').instance().getComponent()); triggerWrapper.find('[title="2018"]').simulate('click'); expect(wrapper.find('.ant-calendar-picker-input').getDOMNode().value).toBe('2018'); }); });
這裏定義了3個測試內容