我对特定项目的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并默认跳过子文件夹中的所有内容。
答案 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)
我一直在为同一个问题寻找解决方案。所提出的答案都不完全适合我的情况:
所以我的最终解决方案是结合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
个文件夹中,文件夹中不应包含任何其他文件。