Jest环境下多文件引用同一模块时返回undefined问题求解
可行解决方案
首先先修正导出语法错误,你当前的导出写法不符合ES模块规范,未声明services变量会触发隐式全局变量创建,Jest的沙箱执行环境下会直接导致导出值异常,先改成标准写法:
const services = (routes) => { const _temp = {}; Object.keys(routes).forEach(route => { _temp[route] = createReducer(route); }); return _temp; } export default services
如果修正后问题还存在,按下面的步骤排查解决:
- 处理Jest模块缓存问题
在测试用例最开头调用jest.resetModules()清除模块缓存,所有用到该模块的地方改用动态require导入,避开静态import的提升逻辑:test('Component test', () => { jest.resetModules() // 动态导入依赖 const services = require('你的services模块路径').default const ComponentUsedForTest = require('你的组件路径').default render(<ComponentUsedForTest/>) }) - 排查循环依赖
执行npx madge --circular 你的项目源码入口路径检测是否存在循环依赖,Jest处理未完成初始化的循环依赖模块时会返回undefined,检测到循环依赖后把公共逻辑抽离到独立无依赖的模块即可解决。 - 改用惰性初始化方式导出
如果你的services是固定传入路由配置生成对象使用,不要在模块顶层直接调用生成常量,改成惰性初始化的导出方式,保证所有导入方拿到的都是初始化完成的对象:
所有用到services的地方统一调用// 在你的services模块里补充 const fixedRoutes = { /* 你的硬编码路由配置 */ } let cachedServices = null export const getServices = () => { if (!cachedServices) { cachedServices = services(fixedRoutes) } return cachedServices }getServices()获取实例,不要直接用顶层初始化的变量。
内容的提问来源于stack exchange,提问作者Wocha
相关产品推荐
相关产品推荐

