如何让nodeunit检测并运行子文件夹中包含的测试?

时间:2012-02-09 01:42:37

标签: node.js nodeunit

我对特定项目的nodeunit测试有以下文件夹结构:

/tests
/tests/basic-test.js
/tests/models/
/tests/models/model1-tests.js
/tests/models/model2-tests.js

我的问题是 - 如何让nodeunit自动执行 tests 文件夹中的所有测试,包括其中包含的子目录?

如果我执行 nodeunit tests ,它只执行basic-test.js并默认跳过子文件夹中的所有内容。

4 个答案:

答案 0 :(得分:4)

使用基于make的魔法(或基于shell的魔法)。

test: 
    nodeunit $(shell find ./tests -name \*.js)

在这里,您将运行find ./tests -name \*.js的结果传递给nodeunit,该结果应以递归方式运行所有javascript测试

答案 1 :(得分:1)

Nodeunit允许您传入运行测试的目录列表。我使用了一个名为diveSync的软件包,它同步并递归地循环遍历文件和目录。我将所有目录存储在一个数组中并将其传递给nodeunit:

var diveSync = require("diveSync"),
    fs = require("fs"),
    nodeUnit = require('nodeunit'),
    directoriesToTest = ['test'];

diveSync(directoriesToTest[0], {directories:true}, function(err, file) {
    if (fs.lstatSync(file).isDirectory()) {
        directoriesToTest.push(file);
    }
})

nodeUnit.reporters.default.run(directoriesToTest);

答案 2 :(得分:0)

虽然这不是上面描述的自动解决方案,但我创建了一个这样的收集器文件:

allTests.js:

exports.registryTests = require("./registryTests.js");
exports.message = require("./messageTests.js")

当我运行nodeunit allTests.js时,它会运行所有测试,并指示分层排列:

? registryTests - [Test 1]
? registryTests - [Test 2]
? messageTests - [Test 1]

等...

虽然创建新的单元测试文件需要将其包含在收集器中,但这是一项简单的一次性任务,我仍然可以单独运行每个文件。对于一个非常大的项目,这也将允许运行多个但不是所有测试的收集器。

答案 3 :(得分:0)

我一直在为同一个问题寻找解决方案。所提出的答案都不完全适合我的情况:

  • 我不想要任何其他依赖项。
  • 我已经在全球范围内安装了nodeunit。
  • 我不想维护测试文件。

所以我的最终解决方案是结合Ian和mbmcavoy的想法:

// nodeunit tests.js
const path = require('path');
const fs = require('fs');

// Add folders you don't want to process here.
const ignores = [path.basename(__filename), 'node_modules', '.git'];
const testPaths = [];

// Reads a dir, finding all the tests inside it.
const readDir = (path) => {
    fs.readdirSync(path).forEach((item) => {
        const thisPath = `${path}/${item}`;
        if (
            ignores.indexOf(item) === -1 &&
            fs.lstatSync(thisPath).isDirectory()
        ) {
            if (item === 'tests') {
                // Tests dir found.
                fs.readdirSync(thisPath).forEach((test) => {
                    testPaths.push(`${thisPath}/${test}`);
                });
            } else {
                // Sub dir found.
                readDir(thisPath);
            }
        }
    });
}

readDir('.', true);
// Feed the tests to nodeunit.
testPaths.forEach((path) => {
    exports[path] = require(path);
});

现在,我可以使用nodeunit tests.js命令运行我的所有新旧测试。

从代码中可以看出,测试文件应位于tests个文件夹中,文件夹中不应包含任何其他文件。