Se vuoi includere più moduli nella tua describe
gerarchia 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 test
sottodirectory 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 importTest
funzione è solo per mostrare come sarebbe possibile gestire la ripetizione di importare più moduli senza dover ridigitare il tutto describe(... require...
ogni volta. Il common
modulo ha lo scopo di contenere ciò che è necessario utilizzare in più moduli della suite di test. In realtà non lo sto usando top
ma potrebbe essere usato lì, se necessario.
Noterò qui che beforeEach
eseguirà il suo codice prima di ogni singolo test registrato, it
indipendentemente dal fatto che appaia all'interno di describe
in top
o in uno qualsiasi dei moduli importati . Con --recursive
, il beforeEach
codice dovrebbe essere copiato in ogni modulo o forse avresti un beforeEach
hook in ogni modulo che chiama una funzione importata da un modulo comune.
Inoltre, l' after
hook verrà eseguito dopo tutti i test nella suite. Questo non può essere replicato con --recursive
. Se si utilizza --recursive
e si aggiunge il codice di after
a 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 top
intestazione non può essere replicata utilizzando --recursive
. Con --recursive
ogni file potrebbe essere describe("top"
ma questo creerebbe una nuova top
intestazione 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 common
questo modo è qualcosa che ho fatto in alcune delle mie suite di test per evitare di dover fare require
un 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' global
oggetto 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 () {});