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

Angular+Karma+Jasmine仅检测polyfill.ts,代码覆盖率异常求助

Angular + Karma + Jasmine 代码覆盖率异常问题

执行ng test --codeCoverage=true --watch=false命令后,覆盖率报告仅能检测到polyfill.ts文件,无法展示全部文件的覆盖率数据,CI流水线中也出现相同问题。尝试修改karma.conf.js、检查angular.json的sourceRoot、调整命令参数等方案均无效,但使用fdescribe时可获取对应文件的覆盖率。

使用的命令

ng test --codeCoverage=true --watch=false

依赖版本

"jasmine-spec-reporter": "~5.0.0",
"json-server": "^0.15.1",
"karma": "~5.0.0",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage-istanbul-reporter": "~3.0.2",
"karma-jasmine": "~3.3.0",
"karma-jasmine-html-reporter": "^1.5.0",
"karma-junit-reporter": "^2.0.1",
"karma-phantomjs-launcher": "^1.0.4",
"@angular-devkit/build-angular": "~0.1000.2",
"@angular/cli": "~10.0.2",
"@angular/compiler-cli": "~10.0.3",

Karma.conf.js 配置

// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html

module.exports = function (config) {
  config.set({
    basePath: "",
    frameworks: ["jasmine", "@angular-devkit/build-angular"],
    plugins: [
      require("karma-jasmine"),
      require("karma-junit-reporter"),
      require("karma-chrome-launcher"),
      require("karma-phantomjs-launcher"),
      require("karma-jasmine-html-reporter"),
      require("karma-coverage-istanbul-reporter"),
      require("@angular-devkit/build-angular/plugins/karma"),
      require('./custom-karma-pluggins/describe-tracker'),
    ],
    client: {
      clearContext: false, // leave Jasmine Spec Runner output visible in browser
    },
    junitReporter: {
      outputDir: "coverage",
      outputFile: "TEST-results-karma.xml",
      suite: "",
    },
    coverageIstanbulReporter: {
      dir: require("path").join(__dirname, "./coverage/universal-ap"),
      reports: ["html", "lcovonly", "text-summary", "cobertura"],
      fixWebpackSourcePaths: true,
    },
    reporters: ["describeTracker", "progress", "junit", "kjhtml"],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ["Chrome"],
    captureTimeOut: 210000,
    browserDisconnectTolerance: 3,
    browserDisconnectTimeout: 210000,
    browserNoActivityTimeout: 210000,
    singleRun: false,
    restartOnFileChange: true,
  });
};

Angular.json 配置

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "universal-ap": {
      "projectType": "application",
      "schematics": {
        "@schematics/angular:component": {
          "style": "scss"
        }
      },
      "root": "",
      "sourceRoot": "src",
      "prefix": "ax",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.app.json",
            "aot": true,
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "stylePreprocessorOptions": {
              "includePaths": [
                "src/styles"
              ]
            },
            "styles": [
              "node_modules/@angular/material/prebuilt-themes/indigo-pink.css",
              "node_modules/flexboxgrid/css/flexboxgrid.min.css",
              "node_modules/normalize.css/normalize.css",
              "src/styles.scss",
              "src/styles/themes/ax-brand-theme.scss"
            ],
            "scripts": []
          },
          "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "3.7mb",
                  "maximumError": "3.7mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "10kb",
                  "maximumError": "40kb"
                }
              ]
            },
            "ax": {
              "assets": [
                {
                  "glob": "web.config",
                  "input": "src/config",
                  "output": "./"
                },
                {
                  "glob": "*.json",
                  "input": "src/config",
                  "output": "./config"
                },
                "src/favicon.ico",
                {
                  "glob": "**/*",
                  "input": "src/assets",
                  "ignore": [
                    "**/whitelabel/**/*"
                  ],
                  "output": "/assets"
                }
              ]
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "universal-ap:build:ax"
          },
          "configurations": {
            "production": {
              "browserTarget": "universal-ap:build:ax"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "universal-ap:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.spec.json",
            "karmaConfig": "karma.conf.js",
            "assets": [
              "src/favicon.ico",
              "src/assets",
              "src/config"
            ],
            "stylePreprocessorOptions": {
              "includePaths": [
                "src/styles"
              ]
            },
            "styles": [
              "node_modules/@angular/material/prebuilt-themes/indigo-pink.css",
              "node_modules/flexboxgrid/css/flexboxgrid.min.css",
              "node_modules/normalize.css/normalize.css",
              "src/styles.scss",
              "src/styles/themes/ax-brand-theme.scss"
            ],
            "scripts": []
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "tsconfig.app.json",
              "tsconfig.spec.json",
              "e2e/tsconfig.json"
            ],
            "exclude": [
              "**/node_modules/**"
            ]
          }
        },
        "e2e": {
          "builder": "@angular-devkit/build-angular:protractor",
          "options": {
            "protractorConfig": "e2e/protractor.conf.js",
            "devServerTarget": "universal-ap:serve"
          },
          "configurations": {
            "production": {
              "devServerTarget": "universal-ap:serve:production"
            }
          }
        }
      }
    }
  },
  "defaultProject": "universal-ap",
  "cli": {
    "analytics": false
  }
}

内容的提问来源于stack exchange,提问作者JSR246

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 22:37:10