simulate方法第二个参数应传什么?适配接收自定义对象的onChange
嘿,我来帮你解决这个问题!
问题出在:你的myChangeFunction接收的是自定义的myObject对象,但simulate方法默认会把你传入的参数包装成标准的React合成事件对象,所以之前的两种写法都没匹配上函数的参数要求。
给你两种可行的解决办法:
方法1:直接调用组件的onChange属性(最直接)
如果不需要模拟事件冒泡这类复杂行为,直接拿到组件实例后调用它的onChange prop就行,完全不用simulate:
const component = mount(<YourCustomComponent onChange={myChangeFunction} />); const updates = { firstname: "john", lastname: "doe" }; // 直接传入自定义对象 component.props().onChange(updates);
方法2:调整simulate的参数,让组件能正确提取自定义对象
如果你的组件内部是通过事件的某个属性来传递自定义对象的(比如组件定义里是onChange={(event) => myChangeFunction(event.detail)}),那你可以把自定义对象放到事件的对应属性里:
const updates = { firstname: "john", lastname: "doe" }; // 把自定义对象放在事件的detail属性里(也可以是其他你定义的属性) component.simulate("change", { detail: updates });
这种情况下,组件内部的onChange需要从事件对象中取出detail作为参数传给myChangeFunction。
顺便说下为什么之前的写法无效:
- 第一种写法
simulate("change", { target: updates }):此时myChangeFunction拿到的是一个包含target属性的事件对象,而不是你想要的myObject,类型不匹配。 - 第二种写法
simulate("change", updates):enzyme会自动把updates包装成合成事件对象,所以函数拿到的不是纯myObject,而是带有额外事件属性的对象,自然也无法正常工作。
内容的提问来源于stack exchange,提问作者blankface
相关产品推荐
相关产品推荐

