Jest导入单个命名导出时运行整个测试文件是什么原因?
Jest导入测试文件内工具函数时触发原文件测试套件执行的原因
这一现象是由以下两个核心原因共同导致的:
- 你的
TestOne文件命中了Jest的测试文件匹配规则
Jest默认会将符合命名规则(如*.test.js/*.spec.js)或存放在__tests__目录下的文件识别为测试用例文件,在测试执行阶段会自动扫描、加载所有匹配的测试文件,执行文件内的测试套件。即使这个文件被其他测试文件导入,只要它符合测试文件匹配规则,Jest仍然会把它作为独立测试文件执行一次。 - 模块导入时会执行文件全量代码
当你在另一个文件中执行import {createObjects} from './TestOne'时,JS引擎会加载并执行TestOne文件的全部顶层代码,除了导出createObjects函数外,文件内的describe、it等测试定义语句也会被执行,Jest运行时会自动识别这些测试定义,将对应的测试用例加入当前的执行队列。
推荐解决方案
- 将公共工具函数抽离到独立的非测试文件中,比如单独存放在
src/utils/createObjects.js这类普通JS文件,测试文件按需导入即可,不要将公共工具和测试用例混写在同一个测试文件内 - 如果确有特殊需求需要保留工具函数在测试文件中,可以给测试套件加执行条件,只有当文件被Jest直接作为测试入口执行时才加载测试用例:
export function createObjects(){ const numObjects = 100; const objects = []; for (let i = 1; i < numObjects + 1; i++) { objects.push(i); } return objects } // 仅当文件作为直接执行的入口时才加载测试用例 if (require.main === module) { describe('Test describe', () => { it('Test', () => { }) }) }
内容的提问来源于stack exchange,提问作者Yoofi Brown-Pobee
相关产品推荐
相关产品推荐

