Jest+Enzyme测试Redux连接容器实例方法时出现函数未定义错误
为什么无法访问Redux连接容器组件的实例方法?
这个问题的核心原因很明确:你用connect()包装后的组件,导出的是一个高阶组件(HOC),而非你手写的ConnectedContainer类本身。
当你用shallow()渲染这个导出的连接组件时,wrapper指向的是这个HOC的实例,而不是你定义的原始组件实例——自然就找不到doSomethingImportant方法了。
解决方案有两种,优先推荐第一种:
1. 导出未连接的原始组件,单独测试
这是最符合单元测试原则的做法:把组件逻辑和Redux连接层分开,单独测试组件本身的行为,不需要牵扯Redux的store。
修改你的组件文件,在默认导出连接后的组件之外,额外导出原始的ConnectedContainer类:
// 在组件文件末尾添加 export { ConnectedContainer }; export default connect(mapStateToProps, mapDispatchToProps)(ConnectedContainer);
然后在测试文件中,直接导入这个未连接的原始组件,手动传入它需要的props即可:
import React from 'react'; import { shallow } from 'enzyme'; import { ConnectedContainer } from '.....'; // 导入未连接的原始组件 describe('ConnectedContainer', () => { describe('doSomethingImportant', () => { it('returns something important', () => { // 手动传入组件需要的props const wrapper = shallow( <ConnectedContainer data={{ /* 测试用数据 */ }} userData={{ /* 测试用数据 */ }} /> ); expect(wrapper.instance().doSomethingImportant()).to.equal(/* 预期结果 */); }); }); });
2. 如果一定要测试连接后的组件,用dive()获取原始组件实例
如果你确实需要测试连接后的完整组件,可以通过shallow的dive()方法,深入到HOC包裹的原始组件实例:
it('returns something important', () => { const wrapper = shallow(container).dive(); // 调用dive()穿透HOC expect(wrapper.instance().doSomethingImportant()).to.equal(/* 预期结果 */); });
注意:如果你的组件被多层HOC包裹,可能需要多次调用dive(),但这种方式不如第一种方法清晰,不推荐作为首选。
额外检查点
顺便确认下你的@autobind装饰器是否正常生效:确保babel已经配置了装饰器语法支持(比如Babel 7+用@babel/plugin-proposal-decorators,旧版本用babel-plugin-transform-decorators-legacy)。不过从你的报错来看,这个不是主要问题,但可以作为排查项。
内容的提问来源于stack exchange,提问作者TheNovice
相关产品推荐
相关产品推荐

