Mocha --recursive 参数报错,如何递归运行子目录测试?
解决Mocha --recursive参数导致模块找不到的问题
这个问题我之前也踩过坑!核心原因是Mocha递归执行子目录测试时,测试文件里的相对路径基准发生了变化:
- 不加
--recursive时,Mocha只运行./test目录下的测试文件,这些文件里的../app是相对于test目录,刚好能定位到根目录的app文件; - 加了
--recursive后,Mocha会遍历test的所有子目录并执行其中的测试,此时测试文件里的../app会以当前子目录为基准解析,自然找不到根目录的目标文件了。
下面是几个靠谱的解决办法:
1. 使用绝对路径引入模块(最推荐)
通过Node.js的__dirname和path模块构建绝对路径,这样不管测试文件在哪个子目录,都能精准定位到根目录的模块。
示例代码:
const path = require('path'); // 根据你的目录层级调整相对根目录的路径,比如test/sub/test.js就用../../app const app = require(path.join(__dirname, '../../app')); // 或者更简洁的写法 const app = require(path.resolve(__dirname, '../../app'));
2. 配置NODE_PATH环境变量
把项目根目录加入Node.js的模块查找路径,这样测试文件里可以直接用模块名引入,不用写相对路径。
类Unix系统(Mac/Linux):
NODE_PATH=. mocha --recursive --timeout 10000 ./test
Windows系统:
set NODE_PATH=. && mocha --recursive --timeout 10000 ./test
设置后,测试文件里直接写const app = require('app')就能找到根目录的app.js了。
3. 用Mocha配置文件统一管理(Mocha 6+)
创建.mocharc.js配置文件,统一设置递归规则、超时时间等,同时配合绝对路径或NODE_PATH解决模块查找问题:
module.exports = { recursive: true, timeout: 10000, spec: ['./test/**/*.test.js'], // 明确指定测试文件的匹配规则 require: ['./test/setup.js'] // 可选:如果需要全局初始化文件 };
之后直接运行mocha命令即可,不用再在命令行写一堆参数。
内容的提问来源于stack exchange,提问作者Boris K
相关产品推荐
相关产品推荐

