我有一个运行所有 nodejs 服务器端测试文件的 grunt 任务。
grunt.registerTask('serverTest', ['env:test', 'mongoose', 'mochaTest']);
在开发测试时,我只想运行我当前正在处理的测试。我的任务是设置运行代码库中所有测试 Assets 的列表:
mochaTest: {
src: testAssets.tests.server,
options: {
reporter: 'spec'
}
},
我想在 cli 中指定一个过滤器参数,以仅从 testAssets.tests.server
中选择一个特定文件,这是一个很大的测试列表,因为它被定义为 modules/*/tests/server/**/*.js
并返回代码库中的每个测试。
例如,如果我在命令行输入以下内容:
grunt serverTest:*fileUnderTest.js
Grunt 会过滤 testAssets.tests.server
并只执行匹配 *fileUnderTest.js
的文件
我通读了文档并看到了很多示例,但无法弄清楚如何在不创建单独的目标并在 grunt 文件中指定文件名的情况下执行此操作。
最佳答案
可能有更有效的方法,但我的 gruntfile 开头的以下代码让过滤对我有用。
// get regex epression from CLI
var expression = grunt.option('filter');
//filter the testAssets.tests.server array
var testFiles = filtered(getGlobbedPaths(testAssets.tests.server),expression);
// test array with regex and return array of matches
var filtered = (function(arr,pattern){
var filtered = [],
i = arr.length,
re = new RegExp(pattern);
while (i--) {
if (re.test(arr[i])) {
filtered.push(arr[i]);
}
}
return filtered;
});
然后 grunt 任务变成:
mochaTest: {
src: testFiles,
options: {
reporter: 'spec'
}
}
grunt.registerTask('serverTest', ['env:test', 'mongoose', 'mochaTest']);
因此命令行调用如:
grunt serverTest --filter=comment.server.model.tests.js
将运行与过滤器匹配的任何测试文件和如下命令:
grunt serverTest
会运行项目中的所有测试文件
作为引用,我的项目基于 meanjs,它包含所有文件路径,所以我运行 getGlobbedPaths()
函数,该函数在 config.js 中定义,在过滤之前首先扩展文件路径数组:
var getGlobbedPaths = function(globPatterns, excludes) {
// URL paths regex
var urlRegex = new RegExp('^(?:[a-z]+:)?\/\/', 'i');
// The output array
var output = [];
// If glob pattern is array so we use each pattern in a recursive way, otherwise we use glob
if (_.isArray(globPatterns)) {
globPatterns.forEach(function(globPattern) {
output = _.union(output, getGlobbedPaths(globPattern, excludes));
});
} else if (_.isString(globPatterns)) {
if (urlRegex.test(globPatterns)) {
output.push(globPatterns);
} else {
glob(globPatterns, {
sync: true
}, function(err, files) {
if (excludes) {
files = files.map(function(file) {
if (_.isArray(excludes)) {
for (var i in excludes) {
file = file.replace(excludes[i], '');
}
} else {
file = file.replace(excludes, '');
}
return file;
});
}
output = _.union(output, files);
});
}
}
return output;
};
关于node.js - 从 cli 过滤 grunt 任务 src,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34694235/