React Native中Jest simulate触发输入框变更失败,测试返回undefined问题
分析与解决:React Native测试中
expect返回undefined的问题 先拆解你测试代码里的几个关键错误,这就是为啥会拿到undefined的核心原因:
1. Enzyme的simulate事件名用错了
你写的是simulate('onChange', ...),但Enzyme的simulate方法需要传原生事件类型名,而非组件的props名。要触发onChange对应的事件,应该传'change'(去掉前面的on前缀)。
2. 获取组件props的语法错误
你用了.prop.value,但Enzyme的prop()是一个方法,必须传入属性名作为参数,正确写法是.prop('value')。
3. React Native的TextInput事件格式和Web完全不同(最容易踩的坑!)
React Native里的TextInput的onChange事件对象没有target.value,输入值是存在event.nativeEvent.text里的。如果你的InputBox是基于RN原生TextInput封装的,那你模拟事件时传的参数格式完全错误,导致组件根本没接收到正确的输入值,自然value就是undefined。
修正后的测试代码示例
it('changes text', () => { // 1. 使用正确的事件名'change' // 2. 传入RN TextInput预期的事件格式(nativeEvent.text) wrapper.find(InputBox).at(0).simulate('change', { nativeEvent: { text: 'givenName' } }); // 3. 用正确的prop()方法获取value属性 expect(wrapper.find(InputBox).at(0).prop('value')).toEqual('given'); });
额外检查:自定义InputBox组件的封装逻辑
如果上面改完还是有问题,要确认你的InputBox是否正确处理了props传递,比如:
// 正确的InputBox封装示例 const InputBox = ({ value, onChange }) => { const handleChange = (event) => { // 把RN的nativeEvent.text转成外部需要的格式 onChange(event.nativeEvent.text); }; return <TextInput value={value} onChange={handleChange} />; };
要是你的InputBox直接把外部传入的onChange绑定给TextInput,但测试时传的是Web格式的target.value,组件肯定拿不到有效输入值。
内容的提问来源于stack exchange,提问作者Shashika Virajh
相关产品推荐
相关产品推荐

