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

如何在Jest配置的setup文件中获取待执行测试文件的路径

Jest 初始化脚本获取测试路径及差异化配置方案

一、setup文件中是否可以获取测试文件路径

  • setupFiles 是在Jest测试环境初始化、所有测试文件加载前全局执行一次,无法获取单个测试文件的路径
  • setupFilesAfterEnv 会在每个测试文件执行前运行,可通过 expect.getState().testPath 获取当前即将运行的测试文件绝对路径,示例代码如下:
// setupFilesAfterEnv 配置的脚本内容
const currentTestPath = expect.getState().testPath

// 根据目录区分设置环境变量
if (currentTestPath.includes('/test/unit/')) {
  process.env.API_MOCK_ENABLED = 'true'
  process.env.DB_CONNECT_DISABLED = 'true'
} else if (currentTestPath.includes('/test/integration/')) {
  process.env.API_MOCK_ENABLED = 'false'
  process.env.DB_CONNECT_DISABLED = 'false'
}

二、其他差异化初始化实现方案

除了直接读取测试路径外,还有3种更易维护的方案可实现需求,且都支持单次运行Jest任务生成统一覆盖率报告:

方案1:多项目(displayName)配置

直接在Jest配置中声明两个项目,分别对应单元测试、集成测试目录,可独立配置环境变量、初始化脚本,无需在测试文件中加额外代码:

// jest.config.js
module.exports = {
  // 两个测试项目共享全局覆盖率配置
  collectCoverage: true,
  coverageReporters: ['lcov', 'text-summary'],
  projects: [
    {
      displayName: 'unit',
      testMatch: ['<rootDir>/test/unit/**/*.test.js'],
      // 单独配置单元测试环境变量
      env: {
        TEST_TYPE: 'unit',
        API_MOCK_ENABLED: 'true'
      },
      // 也可单独指定setup脚本
      setupFilesAfterEnv: ['<rootDir>/setup/unit.js']
    },
    {
      displayName: 'integration',
      testMatch: ['<rootDir>/test/integration/**/*.test.js'],
      env: {
        TEST_TYPE: 'integration',
        API_MOCK_ENABLED: 'false'
      },
      setupFilesAfterEnv: ['<rootDir>/setup/integration.js']
    }
  ]
}

直接执行jest命令即可同时运行两类测试,自动合并覆盖率结果。

方案2:自定义测试环境

通过继承Jest默认测试环境类,在构造函数中获取测试文件路径,完成差异化配置,兼容性比在setup中读取路径更好:

// custom-test-env.js,以jsdom环境为例,node环境可继承jest-environment-node
const JSDOMEnvironment = require('jest-environment-jsdom').default

class CustomTestEnv extends JSDOMEnvironment {
  constructor(config, context) {
    super(config, context)
    // context.testPath 即为当前测试文件绝对路径
    const isUnitTest = context.testPath.includes('/test/unit/')
    // 给测试全局注入环境变量
    this.global.process.env.TEST_TYPE = isUnitTest ? 'unit' : 'integration'
    this.global.process.env.MOCK_ENABLED = String(isUnitTest)
  }
}

module.exports = CustomTestEnv

在jest.config.js中配置testEnvironment: './custom-test-env.js'即可生效。

方案3:基于路径的模块别名映射

如果只是需要加载不同的依赖实现(比如单元测试加载Mock版的数据库依赖,集成测试加载真实实现),可以用Jest的moduleNameMapper按路径区分映射:

// jest.config.js
module.exports = {
  moduleNameMapper: {
    '^@/db$': '<rootDir>/test/mock/db.js',
    // 集成测试目录下的文件优先加载真实db实现
    '/test/integration/.*\\.test\\.js$': {
      '^@/db$': '<rootDir>/src/db.js'
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:15:03