node.js - 从 cli 过滤 grunt 任务 src

标签 node.js testing filter gruntjs meanjs

我有一个运行所有 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/

相关文章:

filter - Java 8 多个过滤器上的流过滤器

javascript - Node js,函数执行

javascript - AWS S3 存储桶上传时出现 CORS 错误

testing - NUnit 3.0 中是否有测试状态属性?

需要 Java JUnit 测试指南

angular - 错误 NullInjectorError : R3InjectorError(DynamicTestModule)[KDSDialogService -> MatDialog -> MatDialog]: NullInjectorError: No provider for MatDialog

空列表上的 Django 查询集过滤器

reactjs - 如何在react-table中添加不区分大小写的过滤组件内容?

node.js - 如何使用dialogflow-nodejs-client-v2将Dialogflow API v2与MS BotFramework集成

node.js - 查看我自己的 Instagram 照片?