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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:28:14