Mocha配置文件中extension与spec选项的关联关系是什么?
Mocha中extension与spec配置的关联解析
先看你给出的配置示例:
module.exports = { extension: ['js', 'cjs', 'mjs'], spec: ['test/**/*.spec.js'], };
关于extension选项的作用
- 单独使用时:Mocha会默认在
test目录(默认不递归子目录,需加--recursive才会遍历子目录)下,查找所有后缀匹配extension列表的文件,比如.js、.cjs、.mjs格式的文件都会被作为测试文件加载。 - 它还有一个辅助作用:当你指定的文件路径/模式省略后缀时,Mocha会自动尝试用
extension里的后缀去补全查找,比如你写spec: ['test/**/*.spec'],Mocha会自动找*.spec.js、*.spec.cjs、*.spec.mjs这些文件。
为什么和spec搭配时mjs扩展名没生效?
spec是用来指定精准的文件匹配模式,它的优先级高于extension的默认查找逻辑。两者搭配时的执行顺序是:
- Mocha先按照
spec里的模式,找出所有符合的文件——你的配置里spec是test/**/*.spec.js,这就限定了只会找后缀为.js的*.spec.js文件,根本不会触及.spec.mjs或.spec.cjs的文件。 - 之后Mocha才会用
extension列表作为过滤条件,从第一步找到的文件里再筛选出后缀匹配的。但第一步已经只有.js文件了,所以mjs和cjs的配置自然不会有效果。
如果想要匹配多种后缀的spec文件,你需要修改spec的模式,比如写成:
spec: ['test/**/*.spec.{js,cjs,mjs}']
这样Mocha会先找到所有这三种后缀的spec文件,再结合extension的过滤(此时extension可以进一步限制允许的后缀,比如如果extension去掉cjs,那.spec.cjs的文件会被排除)。
内容的提问来源于stack exchange,提问作者gremo
相关产品推荐
相关产品推荐

