enzyme模拟checkbox选中与取消

在涉及到checkbox表单元素的单测时,我们会直观的模拟input元素的click事件以触发元素值的改变。但在使用enzyme进行组件单测时却行不通

正确的做法

正确的做法是模拟input元素的change事件,传递想要的target.value。

1
2
3
4
5
6
7
8
9
10
11
12
import React from 'react'
import { mount } from 'enzyme'

it('should change checkbox value', () => {
const changeFn = e => console.log(e.target.checked)
const wrapper = mount(<input type="checkbox" onChange={changeFn} />)
wrapper.find('input').simulate('change', {
target: {
checked: true,
},
})
})

为什么?

enzyme的事件模拟系统并不是我们所想象的那样,操作真实的dom来触发dom级事件而是简单的将simulate转发到props上的相应func。
所以在测试过程中如果我们需要为组件模拟相应的事件,只需要关注组件props上onEventName中的EventName。就像以下情况:

1
2
<input onBlur={handleBlur} /> // simulate('blur')
<div contentEditable onInput={handleInput}></div> // simulate('input')


2019.2.26日更新

enzyme的作者ljharb并不推荐使用 simulate 触发事件的这种写法,因为它有时候会表现的莫名其妙。
作者明确表示我们应该将props的事件监听方法提取出来独立执行,详细见这条Issues

1
2
3
const wrapper = mount(<Slider onDrag={this.handleDrag} />)
const dragFn = wrapper.find('Slider').prop('onDrag')
dragFn()

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×