Подтвердить что ты не робот

Как получить покрытие кармы (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

Обратите внимание, что у меня есть только те файлы GraphToolbar и settings/, которые были рассмотрены до сих пор; пока еще нет тестов для OverviewCanvasControl.js или nodes/ файлов.

Конфигурация кармы

В моем karma.conf.js (coverageотносится к karma-coverage):

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

Проблема

Когда я запускаю карму, препроцессор покрытия и репортер запускаются, но он проверяет только те файлы, которые уже имеют спецификации. Я хочу сообщать о размере 0% для OverviewCanvasControl.js и nodes/ файлов, которые не имеют покрытия. Когда создается новый файл и выполняется карма, я хочу, чтобы он поймал, что у этого файла еще нет Spec.

Как я могу заставить Karma проверить все соответствующие исходные файлы для покрытия, а не только те, у которых уже созданы спецификации?

4b9b3361

Ответ 1

Решение. Я придумал: выйдите из дерева источников и проверьте, существует ли файл спецификаций для каждого исходного файла JS. Это предполагает, что каждый исходный файл имеет соответствующий файл 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"
    });
  });

Почему бы вам не упаковать это как задание для ворчания и опубликовать в NPM?

В основном потому, что он много полагается на конкретные пути и соглашения об именах в вашем проекте. Он еще не исключает каталоги/файлы (это может быть необходимо), и если вы не сделаете *Spec.js, это не сработает. Имо, возможно, проще взять этот фрагмент и настроить его, а не экстернализировать все и сделать его настраиваемой задачей. Возможно, это изменится позже. 😺

Ответ 2

Я боролся с этим, и я нашел довольно приятное решение.

Перед выполнением тестов я выполняю задачу, которая будет проходить через ваши js файлы и требовать их в одном файле спецификации. Это приведет к тому, что файлы будут обработаны, а покрытие кода будет сформировано правильно. Начиная с Стамбула только файлы инструментов, требуемые спецификациями. Показывать покрытие из ваших спецификаций, а не из вашего кода. Это устранит эту проблему.

Это было вдохновлено ответом secoia mcdowell, и я надеюсь, что это поможет другим.

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

Ответ 3

После поиска я пока обнаружил, что это довольно легко. Добавьте это в свой karma.conf.js:

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

BR Крис