Node.js上运行Jasmine报错ERR_UNSUPPORTED_DIR_IMPORT求解决方案
在Windows系统Node.js 18.12.1环境下开发Express v4.18.2应用,使用Jasmine 4.5.0测试控制器时,执行jasmine spec会触发以下错误:
Error [ERR_UNSUPPORTED_DIR_IMPORT]: Directory import '...\SimpleServiceJasmine\spec' is not supported resolving ES modules imported from ...\SimpleServiceJasmine\node_modules\jasmine\lib\loader.js
...
code: 'ERR_UNSUPPORTED_DIR_IMPORT',
url: 'file:///D:/.../SimpleServiceJasmine/spec'
代码和测试文件均使用require而非import,但明确指定单个测试文件或匹配单个文件的通配符时可正常运行,例如:
jasmine spec/service/contact-api.spec.js # 正常运行 jasmine spec/*/c* # 正常运行
尝试将Jasmine降级至3.0.0和2.0.1版本后问题依旧,且在Windows 11和Windows Server 2019上表现一致。以下是可行的解决方案:
解决方案
1. 强制项目使用CommonJS模块类型
在package.json中添加"type": "commonjs",避免Node.js自动将项目识别为ES模块:
{ "name": "simpleservice", "version": "1.0.0", "description": "A simple CRUD API for contacts", "main": "service/contact-api.js", "type": "commonjs", "scripts": { "test": "jasmine", "start": "node src/service/contact-api.js" }, "author": "Puzzled Dev", "license": "ISC", "dependencies": { "express": "^4.18.2" }, "devDependencies": { "jasmine": "^4.5.0" } }
修改后直接运行npm test或jasmine,Jasmine会自动读取spec/support/jasmine.json的配置执行所有测试。
2. 使用通配符直接匹配测试文件
如果不想修改package.json,可以直接用通配符代替目录参数,让Jasmine直接定位到测试文件而非尝试导入目录:
jasmine spec/**/*[sS]pec.js
也可以将这个命令写入package.json的test脚本:
"scripts": { "test": "jasmine spec/**/*[sS]pec.js", "start": "node src/service/contact-api.js" }
3. 清理spec目录下的ES模块文件
检查spec目录及子目录,确保没有.mjs文件或包含import/export语法的.js文件——这类文件会触发Node.js的ES模块解析逻辑,导致目录导入错误。如果存在这类文件,要么改为require语法,要么单独指定文件运行测试。
4. 确认jasmine.json配置有效性
当前的spec/support/jasmine.json配置规则正确,能匹配所有符合命名规范的测试文件:
{ "spec_dir": "spec", "spec_files": [ "**/*[sS]pec.?(m)js" ], "helpers": [ "helpers/**/*.?(m)js" ], "env": { "stopSpecOnExpectationFailure": false, "random": true } }
确保配置文件路径正确,运行jasmine不带参数时会自动加载该配置。
内容的提问来源于stack exchange,提问作者Mike Woinoski

