Si vous souhaitez inclure plusieurs modules dans votre describehiérarchie comme vous le faites dans votre question, ce que vous faites est à peu près tout , à moins que vous ne souhaitiez écrire un chargeur de test personnalisé pour Mocha. L'écriture du chargeur personnalisé ne serait pas plus facile ni ne rendrait votre code plus clair que ce que vous avez déjà.
Voici un exemple de la façon dont je changerais certaines choses. letest sous-répertoire de cet exemple est organisé comme suit:
.
└── 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 importTestfonction est juste de montrer comment il serait possible de gérer la répétition de l'importation de plusieurs modules sans avoir à retaper l'ensembledescribe(... require... à chaque fois. Le commonmodule est destiné à contenir ce que vous devez utiliser dans plusieurs modules de la suite de tests. Je ne l'utilise pas réellement topmais il pourrait être utilisé là-bas, si nécessaire.
Je noterai ici que le beforeEachexécutera son code avant chaque test enregistré avec its'ils apparaissent à l'intérieur du describein topou dans l' un des modules importés . Avec--recursive , le beforeEachcode devrait être copié dans chaque module ou peut-être auriez-vous un beforeEachhook dans chaque module qui appelle une fonction importée d'un module commun.
De plus, le afterhook s'exécutera après tous les tests de la suite. Cela ne peut pas être répliqué avec --recursive. Si vous utilisez --recursiveet ajoutez le code deafter à chaque module, il sera exécuté une fois par module plutôt qu'une seule fois pour tout le test.
L'affichage de tous les tests sous un seul en- toptête ne peut pas être répliqué à l'aide de --recursive. Avec --recursivechaque fichier pourrait avoirdescribe("top" mais cela créerait un nouveau toptitre pour chaque fichier.
common.js:
var chai = require("chai");
var options = {
foo: "foo"
};
exports.options = options;
exports.chai = chai;
exports.assert = chai.assert;
L'utilisation d'un module nommé commoncomme celui-ci est quelque chose que j'ai fait dans certaines de mes suites de tests pour éviter d'avoir à faire requireun tas de choses encore et encore et pour contenir des variables globales en lecture seule ou des fonctions qui ne conservent pas l'état. Je préfère ne pas polluer leglobal objet comme dans la réponse de thgaskell car cet objet est vraiment global et accessible même dans les bibliothèques tierces que votre code peut charger. Ce n'est pas quelque chose que je trouve acceptable dans mon code.
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 () {});