升级Angular至v16后Karma无法检测到测试用例的问题求助
Angular 16升级后Karma无法识别测试套件的问题解决
问题现象
执行ng test --source-map时,测试未实际运行却返回成功,输出信息如下:
Chrome 115.0.0.0 (Windows 10): Executed 0 of 0 SUCCESS (0.003 secs / 0 secs) TOTAL: 0 SUCCESS TOTAL: 0 SUCCESS
Angular 9版本时测试可正常运行,升级至16版本(未手动修改配置文件及测试文件)后出现该问题。在测试文件的describe前添加f(即fdescribe)后反馈略有变化,但仍未实际运行测试。已尝试新增测试文件、检查karma.conf.js和angular.json中的测试配置,未找到有效解决方法。
相关配置文件
karma.conf.js
module.exports = function(config) { config.set({ basePath: '', frameworks: ['jasmine', '@angular-devkit/build-angular'], plugins: [ require('karma-jasmine'), require('karma-chrome-launcher'), require('karma-jasmine-html-reporter'), require('karma-coverage-istanbul-reporter'), require('@angular-devkit/build-angular/plugins/karma') ], client: { clearContext: false // leave Jasmine Spec Runner output visible in browser }, files: [ ], preprocessors: { }, mime: { 'text/x-typescript': ['ts', 'tsx'] }, coverageIstanbulReporter: { dir: require('path').join(__dirname, 'coverage'), reports: ['html', 'lcovonly'], fixWebpackSourcePaths: true }, reporters: config.angularCli && config.angularCli.codeCoverage ? ['progress', 'coverage-istanbul'] : ['progress', 'kjhtml'], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: true, browsers: ['Chrome'], singleRun: false }); };
tsconfig.spec.json
{ "compilerOptions": { "sourceMap": true, "declaration": false, "moduleResolution": "node", "experimentalDecorators": true, "lib": [ "es2016", "dom" ], "outDir": "../out-tsc/spec", "module": "esnext", "target": "ES2022", "baseUrl": "", "types": [ "jasmine", "node" ], "useDefineForClassFields": false }, "files": [ "test.ts", "polyfills.ts" ], "include": [ "**/*.spec.ts" ] }
test.ts
import 'zone.js/dist/long-stack-trace-zone'; import 'zone.js/dist/proxy.js'; import 'zone.js/dist/sync-test'; import 'zone.js/dist/jasmine-patch'; import 'zone.js/dist/async-test'; import 'zone.js/dist/fake-async-test'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. declare var __karma__: any; // Prevent Karma from running prematurely. __karma__.loaded = function () {}; // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { teardown: { destroyAfterEach: false } } ); // Finally, start Karma to run the tests. __karma__.start();
angular.json 测试配置
"test": { "builder": "@angular-devkit/build-angular:karma", "options": { "main": "src/test.ts", "karmaConfig": "./karma.conf.js", "polyfills": "src/polyfills.ts", "tsConfig": "src/tsconfig.spec.json", "scripts": [], "styles": [ "node_modules/bootstrap/dist/css/bootstrap.min.css", "src/css/styles.css" ], "assets": [ "src/assets", "src/favicon.png", "src/i18n", "src/web.config" ] } }
package.json devDependencies
"devDependencies": { "@angular-devkit/build-angular": "^16.2.0", "@types/eslint": "^8.40.2", "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", "karma": "~6.4.2", "karma-chrome-launcher": "~3.1.0", "karma-cli": "~1.0.1", "karma-coverage-istanbul-reporter": "^0.2.0", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", "ts-node": "~2.0.0", "tslint": "~6.1.3" }
可能的解决方向
- 升级依赖版本:Angular 16对Jasmine、Karma等依赖的版本要求更高,当前
jasmine-core(3.6.0)、`@types/jasmine`(3.6.0)版本过低,建议升级到与Angular 16匹配的版本(如Jasmine 4.x或5.x)。 - 调整Zone.js配置:检查polyfills.ts中是否正确导入Zone.js的测试相关模块,或直接更新Zone.js到Angular 16对应的版本。
- 修正tsconfig路径匹配:将
tsconfig.spec.json中的include字段改为src/**/*.spec.ts,明确指定测试文件所在路径,避免匹配歧义。 - 手动指定Karma测试文件:在
karma.conf.js的files数组中添加src/**/*.spec.ts,强制Karma加载测试文件。 - 清理构建缓存:执行
ng clean清理项目缓存后,重新运行测试。
内容的提问来源于stack exchange,提问作者Kianni
相关产品推荐
相关产品推荐

