我想测试我的组件中的Select
组件正确调用我的onChange
和onBlur
处理程序。我使用jest
作为我的测试框架,使用enzyme
来渲染我的组件以进行测试。需要测试处理程序道具是由复合React组件调用的
组件
import {Select} from 'antd'
function MyComponent (props) {
const { onChange, onBlur, value, ...rest} = props
return (<Select
{...rest}
value={value}
onChange={onChange}
onBlur={onBlur}
/>)
}
测试
describe('MyComponent',() => {
it('calls the onChange if the value of select changes',() => {
const onChange = jest.fn()
const options = {
enumOptions: [
{
label: 'Foo',
value: 'foo'
},
{
label: 'Bar',
value: 'bar'
}
]
}
const wrapper = mount(<MyComponent options={options} onChange={onChange} />)
const select = wrapper.find('select')
select.simulate('change')
expect(onChange).toHaveBeenCalled()
})
})
问题/疑问
的问题是,Select
组件不渲染select
的Elemen T,所以试图抓住select
元素和simulate
事件上它会导致一个问题:
Method “simulate” is only meant to be run on a single node. 0 found instead.
at ReactWrapper.single (node_modules/enzyme/build/ReactWrapper.js:1419:17)
at ReactWrapper.simulate (node_modules/enzyme/build/ReactWrapper.js:769:14)
at Object.it (src/form-schema/widgets/Select/index.spec.js:172:12)
at Promise (<anonymous>)
at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:169:7)
我怎样才能确保onChange
事件在组件上呼吁,而不必simulate
它。
替代方法上Select
setProps
给力的变化。
我想用enzyme
我发现setProps
从enzyme
仅支持根组件上,当我试图做我的组件中的道具传递到嵌套组件:
错误
ShallowWrapper::setProps() can only be called on the root
at ShallowWrapper.setProps (node_modules/enzyme/build/ShallowWrapper.js:339:17)
at Object.it (src/form-schema/widgets/Select/index.spec.js:150:12)
at Promise (<anonymous>)
at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:169:7)
-
上顶层组分
- setProps两次:
传递一个value
道具,通过另一value
托下来后立即引起变化:
const wrapper = shallow(<Select options={options} onChange={onChange} />)
const select = wrapper.find(AntdSelect)
wrapper.setProps({value: 'bar'})
wrapper.setProps({value: 'foo'})
错误
expect(jest.fn()).toHaveBeenCalled()
Expected mock function to have been called.
at Object.it (src/form-schema/widgets/Select/index.spec.js:153:22)
at Promise (<anonymous>)
at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:169:7)