Se vuoi includere più moduli nella tua describegerarchia come stai facendo nella tua domanda, quello che stai facendo è praticamente quello , a meno che tu non voglia scrivere un caricatore di test personalizzato per Mocha. Scrivere il caricatore personalizzato non sarebbe più facile o rendere il tuo codice più chiaro di quello che hai già.
Ecco un esempio di come cambierei alcune cose. La testsottodirectory in questo esempio è organizzata come:
.
└── test
├── a
│ └── a.js
├── b
│ └── b.js
├── common.js
└── top.js
top.js:
function importTest(name, path) {
describe(name, function () {
require(path);
});
}
var common = require("./common");
describe("top", function () {
beforeEach(function () {
console.log("running something before each test");
});
importTest("a", './a/a');
importTest("b", './b/b');
after(function () {
console.log("after all tests");
});
});
La importTestfunzione è solo per mostrare come sarebbe possibile gestire la ripetizione di importare più moduli senza dover ridigitare il tutto describe(... require...ogni volta. Il commonmodulo ha lo scopo di contenere ciò che è necessario utilizzare in più moduli della suite di test. In realtà non lo sto usando topma potrebbe essere usato lì, se necessario.
Noterò qui che beforeEacheseguirà il suo codice prima di ogni singolo test registrato, itindipendentemente dal fatto che appaia all'interno di describein topo in uno qualsiasi dei moduli importati . Con --recursive, il beforeEachcodice dovrebbe essere copiato in ogni modulo o forse avresti un beforeEachhook in ogni modulo che chiama una funzione importata da un modulo comune.
Inoltre, l' afterhook verrà eseguito dopo tutti i test nella suite. Questo non può essere replicato con --recursive. Se si utilizza --recursivee si aggiunge il codice di aftera ciascun modulo, verrà eseguito una volta per modulo anziché solo una volta per l' intero test.
La visualizzazione di tutti i test sotto una singola topintestazione non può essere replicata utilizzando --recursive. Con --recursiveogni file potrebbe essere describe("top"ma questo creerebbe una nuova topintestazione per ogni file.
common.js:
var chai = require("chai");
var options = {
foo: "foo"
};
exports.options = options;
exports.chai = chai;
exports.assert = chai.assert;
L'utilizzo di un modulo chiamato in commonquesto modo è qualcosa che ho fatto in alcune delle mie suite di test per evitare di dover fare requireun mucchio di cose più e più volte e per mantenere variabili o funzioni globali di sola lettura che non mantengono lo stato. Preferisco non inquinare l' globaloggetto come nella risposta di thgaskell perché questo oggetto è veramente globale e accessibile anche in librerie di terze parti che il tuo codice potrebbe caricare. Questo non è qualcosa che trovo accettabile nel mio codice.
a/a.js:
var common = require("../common");
var options = common.options;
var assert = common.assert;
it("blah a", function () {
console.log(options.foo);
assert.isTrue(false);
});
b/b.js:
it("blah b", function () {});