如何获得karma-coverage(伊斯坦布尔)来检查所有源文件的覆盖范围?

时间:2014-05-22 17:15:49

标签: karma-runner istanbul

代码结构

我有一个app目录结构,如

scripts/sequoia/                              
├── GraphToolbar.js                     
├── nodes                                     
│   ├── activityNode.js                       
│   └── annotationNode.js                     
├── OverviewCanvasControl.js                  
└── settings                                  
    ├── GraphControlSettingsFactory.js        
    └── SnapContextFactory.js                 

我的test目录当前看起来是

test/spec/                                        
├── GraphToolbarSpec.js                           
├── settings                                      
│   ├── graphControlSettingsFactorySpec.js        
│   └── snapContextFactorySpec.js                 
└── test-main.js

请注意,到目前为止,我只提供了GraphToolbarsettings/个文件; OverviewCanvasControl.jsnodes/个文件尚未测试

业力配置

在我的karma.conf.jscoverage引用karma-coverage)中:

preprocessors: {                     
  'scripts/sequoia/**/*.js': ['coverage']
},                                   
reporters: ['progress','coverage'],

问题

当我经营业力时,覆盖预处理器&记者跑,但只检查已经编写规范的文件。我想报告OverviewCanvasControl.js的0%覆盖率和没有覆盖率的nodes/文件。创建新文件时& karma运行,我希望它能够捕获该文件还没有Spec。

如何让Karma检查所有匹配的源文件的覆盖范围,而不仅仅是那些已经创建规格的文件?

3 个答案:

答案 0 :(得分:4)

在找到我之后,我发现它很容易。将其添加到您的karma.conf.js:

coverageReporter: {
    includeAllSources: true,
    reporters: [
        ...
    ]
}

BR 克里斯

答案 1 :(得分:3)

我正在努力解决这个问题,我找到了一个非常好的解决方案。

在执行测试之前,我执行一个任务,该任务将遍历您的js文件并在单个spec文件中要求它们。这将使文件得到检测,并且将正确生成代码覆盖率。由于伊斯坦布尔只提供规格要求的文件。 显示您的规格的覆盖范围,而不是代码。这将解决这个问题。

它的灵感来自红杉的mcdowell反应,我希望它可以帮助别人。

http://shared-mind.tumblr.com/post/89641439478/istanbul-code-coverage-force-instrumentation-of-all-file

答案 2 :(得分:2)

解决方案我提出了:步行源树&检查每个源JS文件是否存在spec文件。这假设每个源文件都有一个相应的Spec.js文件(驻留在相应的目录结构中)。

  • app/scripts/moduleFoo.jstest/spec/moduleFooSpec.js
  • app/scripts/ns1/Utils/foo_bar.jstest/spec/ns1/Utils/foo_barSpec.js

任务依赖于fs-tools npm模块。

var fsTools = require('fs-tools');
//... module.exports = function(grunt) { ... etc. (gruntfile setup)

  grunt.registerTask('checkspecs', 'ensure that all js files have Specs', function(){
    var done = this.async();
    var srcPath = './'+cfg.app+'/scripts/'; //Where are your scripts?
    var testPath = './test/spec/';          //Where are your specs?
    var missingSpecs = [];
    fsTools.walk(srcPath, '.js$', function(path,stats,callback){
      var specPath = testPath + path.substring(path.indexOf('ptc')+4);
      //strip .js, add Spec.js
      specPath = specPath.split('').slice(0,-3).join('') + 'Spec.js';
      if(!grunt.file.exists(specPath)){
        missingSpecs.push(path);
      }
      callback();
    }, function (err){
      if(err){
        grunt.log.error(err);
        done(false);
      }
      if(missingSpecs.length > 0){
        grunt.log.warn('`Spec.js` files are missing for the following files!!');
        missingSpecs.forEach(function(path){
          grunt.log.warn(path);
        });
      }else{
        grunt.log.ok('Spec files present for all source files');
      }
      done(!err);                   //fail only if fsTools.walk throws
      //done(!missingSpecs.length); //fail if any specs are "missing"
    });
  });

为什么不将此打包为grunt任务并发布到NPM?

主要是因为它在很大程度上依赖于特定的路径和您的项目中的命名约定。它还没有排除目录/文件(这可能是必要的)&如果你不做*Spec.js它就不会工作。 Imo它可能更容易采取这个片段&定制它而不是外化所有东西&使它成为一个可配置的任务。以后可能会改变它。