You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:01:07