Angular 15项目中,如何无需修改sourceRoot让Karma识别src外测试文件?
将Angular从14升级到15后,原本放在项目根目录test文件夹(src目录外)的Karma测试spec文件无法被识别,Karma要求测试文件必须位于angular.json中sourceRoot指定的文件夹内。当前angular.json相关配置片段如下:
// angular.json "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "project-name": { "root": "", "sourceRoot": "" // 仅当设为空值时可找到测试文件,但希望保留原有sourceRoot配置 } }
请问是否可以让Karma从工作区根目录向下扫描所有测试文件,同时不修改angular.json中的sourceRoot属性?
注:此前将sourceRoot设为空值时,Karma能识别工作区及子目录的测试文件,这是因为tsconfig.spec.json中配置了全局扫描规则:
// tsconfig.spec.json "include": [ "**/*.spec.ts", "**/*.d.ts" ]
无需修改angular.json的sourceRoot属性,通过以下几步配置即可实现Karma全局扫描测试文件:
保留
tsconfig.spec.json的全局include规则
确保tsconfig.spec.json中的include数组包含**/*.spec.ts,这会让TypeScript编译器遍历所有子目录,识别所有测试文件:"include": [ "**/*.spec.ts", "**/*.d.ts" ]调整Karma配置文件(
karma.conf.js)
在karma.conf.js中修改files和preprocessors配置,让Karma直接加载所有符合规则的测试文件,绕过sourceRoot的路径限制:module.exports = function(config) { config.set({ // 其他原有配置... files: [ '**/*.spec.ts' // 全局匹配所有.spec.ts文件 ], preprocessors: { '**/*.spec.ts': ['webpack', 'sourcemap'] // 对应测试文件的预处理规则 } }); };检查Angular CLI测试目标配置
确认angular.json中test目标的tsConfig指向正确的tsconfig.spec.json,并且移除任何可能限制文件路径的files或include配置项:"test": { "builder": "@angular-devkit/build-angular:karma", "options": { "tsConfig": "tsconfig.spec.json", // 移除此处可能存在的路径限制配置 } }
完成以上配置后,Karma会依据tsconfig.spec.json的全局规则和自身文件匹配逻辑,扫描整个工作区的测试文件,无需改动sourceRoot属性。
内容的提问来源于stack exchange,提问作者Nils Johansson

