Ответ 1
Решение. Я придумал: выйдите из дерева источников и проверьте, существует ли файл спецификаций для каждого исходного файла JS. Это предполагает, что каждый исходный файл имеет соответствующий файл Spec.js
(находящийся в соответствующей структуре каталогов).
-
app/scripts/moduleFoo.js
→test/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"
});
});
Почему бы вам не упаковать это как задание для ворчания и опубликовать в NPM?
В основном потому, что он много полагается на конкретные пути и соглашения об именах в вашем проекте. Он еще не исключает каталоги/файлы (это может быть необходимо), и если вы не сделаете *Spec.js
, это не сработает. Имо, возможно, проще взять этот фрагмент и настроить его, а не экстернализировать все и сделать его настраиваемой задачей. Возможно, это изменится позже. 😺