Angular-cli测试覆盖所有文件

时间:2017-02-16 17:06:26

标签: angular jasmine angular-cli

我正在运行以下命令进行单元测试并生成代码覆盖率报告。

no_note=0

它正在覆盖文件夹中编写代码覆盖率报告。

我需要查看整个项目的覆盖范围,而不仅仅是有测试的文件。

karma.conf.js

ng test --code-coverage

6 个答案:

答案 0 :(得分:11)

我遇到了同样的问题,我找到了一个简单的解决方法,无需任何大配置即可为我提供技巧。

  1. 在您的app文件夹中,创建一个文件app.module.spec.ts
  2. 在此文件中添加导入到您的应用模块。
  3. import './app.module';

    就是这样;)

    关键是,您的应用模块很可能是您的应用程序的核心部分,它直接或间接地导入任何其他使用过的文件。现在您已经创建了spec文件,模块中包含的所有内容也应该包含在测试覆盖率报告中。

    我不是100%确定这是否适用于延迟加载的模块。如果没有,您只需在app.module.spec.ts中导入这些延迟加载的模块,或者在每个模块中创建一个spec文件,然后导入模块。

答案 1 :(得分:9)

以下是执行此操作的方法:

  1. client部分添加到karma.conf.js,如下所示:

    plugins: [
        ...
    ],
    client: {
        codeCoverage: config.angularCli.codeCoverage
    },
    files: [
        ...
    ],
    
  2. 根据test.ts参数

    codeCoverage更改为要求文件
    let context; 
    
    if (__karma__.config.codeCoverage) {
        context = require.context('./app/', true, /\.ts/);
    } else {
        context = require.context('./app/', true, /\.spec\.ts/);
    }
    
    context.keys().map(context);
    
  3. 更新:

    由于Angular CLI 1.5.0需要执行其他步骤:

    1. tsconfig.spec.json添加tsconfig-cc.spec.json文件旁边,其中包含以下内容:

      {
        "extends": "./tsconfig.spec.json",
        "include": [
          "**/*.ts"
        ]
      }
      
    2. angular-cli.json中将以下内容添加到apps数组:

      {
        "root": "src/",
        "polyfills": "polyfills.ts",
        "test": "test.ts",
        "testTsconfig": "tsconfig-cc.spec.json"
      }
      
    3. karma.conf.js中将以下内容添加到angularCli部分:

      app: config.angularCli.codeCoverage ? '1' : '0'  
      

      最终应该看起来像这样:

      angularCli: {
          environment: 'dev',
          app: config.angularCli.codeCoverage ? '1' : '0'
      },
      
    4. 那么这里发生了什么?

      显然他们已经修复了Angular编译器插件,它现在从tsconfig.spec.json获取文件globs。只要我们在**/*.spec.ts中仅包含tsconfig.spec.json,这些就是唯一包含在覆盖范围内的文件。

      显而易见的解决方案是让tsconfig.spec.json包含所有文件(除require.context之外)。但是,即使在没有覆盖的情况下运行(这是我们不想要的),这也会减慢所有测试的速度。

      其中一个解决方案是使用angular-cli处理多个应用的​​功能 通过在apps数组中添加另一个条目,我们会为"另一个"添加另一个配置。 (实际上是同一个)app 我们删除此配置中的所有不相关信息,只留下测试配置,并添加另一个tsconfig,其中包含所有ts个文件。
      最后,我们告诉angular-cli karma插件使用第二个应用程序(索引1)的配置运行测试,以防它运行代码覆盖并运行第一个应用程序(索引0)的配置,如果它在没有代码覆盖率的情况下运行。

      重要说明:在此配置中,我假设您在.angular-cli.json中只有一个应用程序。如果你有更多,你必须相应地调整索引。

答案 2 :(得分:0)

1)在./src/test.ts中设置 /然后找到所有测试。

const context = require.context(‘./app/’, true, /\.ts/);

代替标准 2)使用

更新src / tsconfig.spec.json
“include”: [


 “**/*.ts”

3)在angular.json中设置

“test”: {
     “builder”: “@angular-devkit/build-angular:karma”,
     “options”: {
       “codeCoverage”: true,
       “main”: “src/test.ts”,
       “polyfills”: “src/polyfills.ts”,
       “tsConfig”: “src/tsconfig.spec.json”,
       “karmaConfig”: “src/karma.conf.js”,
       “styles”: [
         “src/styles.scss”
       ],
       “scripts”: [],
       “assets”: [
         “src/favicon.ico”,
         “src/assets”,
         “src/config”,
         “src/manifest.json”
       ]
     }
   }

我的意思是添加此参数“ codeCoverage”:是

对我来说,它包括所有文件

我的意思是添加此参数“ codeCoverage”:是

对我来说,它包括所有文件

答案 3 :(得分:0)

我刚刚创建了业力插件,该插件将项目中的所有文件添加到coverage统计信息-https://github.com/kopach/karma-sabarivka-reporter

要使用它→安装npm install --save-dev karma-sabarivka-reporter

并像这样更新karma.conf.js

reporters: [
  // ...
  'sabarivka'
  // ...
],
coverageReporter: {
    include: 'src/**/!(*.spec|*.module|environment*).ts', // glob patter which  matchs all the files you want to be included into the coverage result
    exclude: 'src/main.ts',
    // ...
},

这无需任何其他操作即可解决问题。易于添加到现有项目以及新项目中。

答案 4 :(得分:-1)

karma.conf.js应该是这样的。无需任何其他配置,cli将负责一切。停止上一次运行ng test并运行ng test --code-coverage

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular/cli'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular/cli/plugins/karma')
    ],
    client:{
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    coverageIstanbulReporter: {
      reports: [ 'html', 'lcovonly' ],
      fixWebpackSourcePaths: true
    },
    angularCli: {
      environment: 'dev'
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['Chrome'],
    singleRun: false
  });
};

答案 5 :(得分:-5)

使用以下给定命令检查代码覆盖率:

ng test -cc