You need to enable JavaScript to run this app. Jest环境下多文件引用同一模块时返回undefined问题求解
优惠活动
大模型
产品
解决方案
定价
更多

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模块里补充
    const fixedRoutes = { /* 你的硬编码路由配置 */ }
    let cachedServices = null
    export const getServices = () => {
      if (!cachedServices) {
        cachedServices = services(fixedRoutes)
      }
      return cachedServices
    }
    
    所有用到services的地方统一调用getServices()获取实例,不要直接用顶层初始化的变量。

内容的提问来源于stack exchange,提问作者Wocha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 19:39:03