TDD和BDD有各自的使用场景,BDD一般偏向于系统功能和业务逻辑的自动化测试设计;而TDD在快速开发并测试功能模块的过程中则更加高效,以快速完成开发为目的。
Jest是Facebook开源的一个前端测试框架,主要用于React和React Native的单元测试,已被集成在create-react-app中。Jest特点:
Enzyme是Airbnb开源的React测试工具库库,它功能过对官方的测试工具库ReactTestUtils的二次封装,提供了一套简洁强大的 API,并内置Cheerio,
实现了jQuery风格的方式进行DOM 处理,开发体验十分友好。在开源社区有超高人气,同时也获得了React 官方的推荐。
三种方法中,shallow和mount因为返回的是DOM对象,可以用simulate进行交互模拟,而render方法不可以。一般shallow方法就可以满足需求,如果需要对子组件进行判断,需要使用render,如果需要测试组件的生命周期,需要使用mount方法。
simulate(event, mock):模拟事件,用来触发事件,event为事件名称,mock为一个event object
instance():返回组件的实例
find(selector):根据选择器查找节点,selector可以是CSS中的选择器,或者是组件的构造函数,组件的display name等
at(index):返回一个渲染过的对象
get(index):返回一个react node,要测试它,需要重新渲染
contains(nodeOrNodes):当前对象是否包含参数重点 node,参数类型为react对象或对象数组
text():返回当前组件的文本内容
html(): 返回当前组件的HTML代码形式
props():返回根组件的所有属性
prop(key):返回根组件的指定属性
state():返回根组件的状态
setState(nextState):设置根组件的状态
setProps(nextProps):设置根组件的属性
expect(value):要测试一个值进行断言的时候,要使用expect对值进行包裹
toBe(value):使用Object.is来进行比较,如果进行浮点数的比较,要使用toBeCloseTo
not:用来取反
toEqual(value):用于对象的深比较
toMatch(regexpOrString):用来检查字符串是否匹配,可以是正则表达式或者字符串
toContain(item):用来判断item是否在一个数组中,也可以用于字符串的判断
toBeNull(value):只匹配null
toBeUndefined(value):只匹配undefined
toBeDefined(value):与toBeUndefined相反
toBeTruthy(value):匹配任何使if语句为真的值
toBeFalsy(value):匹配任何使if语句为假的值
toBeGreaterThan(number): 大于
toBeGreaterThanOrEqual(number):大于等于
toBeLessThan(number):小于
toBeLessThanOrEqual(number):小于等于
toBeInstanceOf(class):判断是不是class的实例
anything(value):匹配除了null和undefined以外的所有值
resolves:用来取出promise为fulfilled时包裹的值,支持链式调用
rejects:用来取出promise为rejected时包裹的值,支持链式调用
toHaveBeenCalled():用来判断mock function是否被调用过
toHaveBeenCalledTimes(number):用来判断mock function被调用的次数
assertions(number):验证在一个测试用例中有number个断言被调用
extend(matchers):自定义一些断言
it('should has Button', () => {
const { wrapper } = setup();
expect(wrapper.find('Button').length).toBe(2);
});
it('should render 2 item', () => {
const { wrapper } = setupByRender();
expect(wrapper.find('button').length).toBe(2);
});
it('should render item equal', () => {
const { wrapper } = setupByMount();
wrapper.find('.item-text').forEach((node, index) => {
expect(node.text()).toBe(wrapper.props().list[index])
});
});
it('click item to be done', () => {
const { wrapper } = setupByMount();
wrapper.find('Button').at(0).simulate('click');
expect(props.deleteTodo).toBeCalled();
});
#### 使用 snapshot 进行 UI 测试
``` javascript
it(‘renders correctly‘, () => {
const tree = renderer
.create(<TodoList {...props} />)
.toJSON();
expect(tree).toMatchSnapshot();
});
#### 测试组件的内部函数
javascript
it(‘calls component handleTest‘, () => { // class中使用箭头函数来定义方法
const { wrapper } = setup();
const spyFunction = jest.spyOn(wrapper.instance(), ‘handleTest‘);
wrapper.instance().handleTest();
expect(spyFunction).toHaveBeenCalled();
spyFunction.mockRestore();
});
it(‘calls component handleTest2‘, () => { //在constructor使用bind来定义方法
const spyFunction = jest.spyOn(TodoList.prototype, ‘handleTest2‘);
const { wrapper } = setup();
wrapper.instance().handleTest2();
expect(spyFunction).toHaveBeenCalled();
spyFunction.mockRestore();
});
```
原文:https://www.cnblogs.com/Nyan-Workflow-FC/p/12073258.html