2

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

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

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

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

4

4 回答 4

4

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

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

在这里,您将运行结果传递find ./tests -name \*.jsnodeunit应该递归运行所有 javascript 测试

于 2012-02-09T01:48:30.790 回答
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);
于 2014-03-30T19:23:55.230 回答
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]

ETC...

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

于 2013-10-03T05:03:40.743 回答
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文件夹中,并且文件夹不应该有任何其他文件。

于 2017-06-17T16:11:35.067 回答