26

代码结构

我有一个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

请注意,我只有到目前为止所涵盖GraphToolbar的文件;settings/没有测试OverviewCanvasControl.js文件nodes/

业力配置

在我的karma.conf.jscoveragekarma-coverage):

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

问题

当我运行 karma 时,覆盖预处理器和报告器运行,但它只检查已经写入规范的文件。我想报告 0% 的覆盖率OverviewCanvasControl.jsnodes/没有覆盖率的文件。当创建一个新文件并运行业力时,我希望它能够捕捉到该文件还没有规范。

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

4

3 回答 3

4

在搜索了我之后,我发现这很容易。将此添加到您的 karma.conf.js:

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

克里斯

于 2016-06-30T11:48:31.917 回答
3

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

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

它的灵感来自红杉麦克道尔的反应,我希望它对其他人有所帮助。

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

于 2014-06-24T10:20:42.163 回答
2

我想出的解决方案:遍历源代码树并检查每个源 JS 文件是否存在规范文件。这假设每个源文件都有一个对应的Spec.js文件(位于对应的目录结构中)。

  • app/scripts/moduleFoo.jstest/spec/moduleFooSpec.js
  • app/scripts/ns1/Utils/foo_bar.js→<代码>test/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,它就行不通。在我看来,获取此片段并对其进行自定义可能比将所有内容外部化并使其成为可配置的任务更容易。以后可能会改变这个。

于 2014-06-09T21:14:33.080 回答