如何在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
相关产品推荐
相关产品推荐

