Question

I have the following folder structure to my nodeunit tests for a particular project:

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

My question is - how do I get nodeunit to automatically execute ALL of the tests in the tests folder, including the sub-directories contained within?

If I execute nodeunit tests it only executes basic-test.js and skips everything in the sub-folders by default.

Était-ce utile?

La solution

Use make based magic (or shell based magic).

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

Here your passing the result of running find ./tests -name \*.js to nodeunit which should run all javascript tests recursively

Autres conseils

Nodeunit allows you to pass in a list of directories from which to run tests. I used a package called diveSync which synchronously and recursively loops over files and directories. I store all the directories in an array and pass it to 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);

While this is not an automatic solution as described above, I have created a collector file like this:

allTests.js:

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

When I run nodeunit allTests.js, it does run all the tests, and indicates the hierarchical arrangement as well:

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

etc...

While the creation of a new unit test file will require including it in the collector, that is an easy, one-time task, and I can still run each file individually. For a very large project, this would also allow collectors that run more than one, but not all tests.

I was looking for solutions for the same question. None of the presented answers fully suited my situation where:

  • I didn't want to have any additional dependencies.
  • I already had nodeunit installed globally.
  • I didn't want to maintain the test file.

So the final solution for me was to combine Ian's and mbmcavoy's ideas:

// 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);
});

Now I can run all my tests, new and old, with a mere nodeunit tests.js command.

As you can see from the code, the test files should be inside tests folders and the folders should not have any other files.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top