You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jest运行单元测试报错:无法读取config/runtime.json配置文件

问题分析与解决方案

问题原因

这个报错是node-config库的典型加载失败错误,结合仅单个spec文件报错的场景,核心触发原因如下:

  1. 该spec文件是唯一导入了src/utils/s3.utils.ts的测试用例:你在s3.utils.ts的模块顶层直接调用了config.get(),模块导入时就会触发config库的配置加载逻辑,其他未导入该文件的测试自然不会触发报错。
  2. 测试运行上下文异常:要么是该spec的运行工作目录不是项目根目录(config文件夹所在目录),node-config找不到对应配置路径;要么是运行时NODE_ENV被修改为没有对应配置文件的值,导致配置加载失败,库内部逻辑调用replace时变量为undefined抛出错误。
  3. 缺少测试环境对应的配置文件:如果测试运行时NODE_ENV=test,但config文件夹下没有test.json或default.json配置文件,也会触发该错误。

解决方案

第一步:确认运行上下文参数

在报错的spec文件最顶部加入以下代码,运行测试后确认参数:

console.log('当前工作目录:', process.cwd())
console.log('当前NODE_ENV值:', process.env.NODE_ENV)

确认工作目录是否为项目根目录(包含config文件夹的目录),以及对应的NODE_ENV值是否存在对应的配置文件。

第二步:固定config加载路径

如果是工作目录异常导致的问题,可以手动指定CONFIG_DIR环境变量指向config文件夹路径,以jest为例:

  1. 在jest配置中新增全局前置文件:
// jest.config.js
module.exports = {
  // 其他原有配置
  setupFiles: ['<rootDir>/test/setup.ts'],
}
  1. 在setup.ts中指定配置路径:
import path from 'path'
process.env.CONFIG_DIR = path.resolve(__dirname, '../config')

第三步:优化配置读取逻辑(推荐)

避免在模块顶层调用config.get(),改为调用init函数时再读取配置,防止导入时就触发配置加载:

// 修改后的src/utils/s3.utils.ts
import config from 'config';
import { S3 } from 'aws-sdk';
import {
  ListObjectsRequest,
  ListObjectsOutput,
  ObjectList,
} from 'aws-sdk/clients/s3';
import logger from './logger.utils';

let s3: S3;

export function init(): void {
  // 配置读取移到init内部,调用时才执行
  const S3_SYNC_TIMEOUT: number = config.get('S3_SYNC_TIMEOUT');
  const AWS_REGION: string = config.get('AWS_REGION');
  s3 = new S3({
    region: AWS_REGION,
  });
}

第四步:测试环境mock配置(可选)

如果测试不需要用到真实的s3逻辑,可以直接mockconfig库,避免读取实际配置文件,以jest为例:

// 在报错的spec文件顶部加入mock逻辑
jest.mock('config', () => ({
  get: jest.fn((key: string) => {
    const mockMap = {
      S3_SYNC_TIMEOUT: 3000,
      AWS_REGION: 'us-east-1'
    }
    return mockMap[key as keyof typeof mockMap]
  })
}))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:57:03