Si vous souhaitez inclure plusieurs modules dans votre describe
hié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 importTest
fonction 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 common
module est destiné à contenir ce que vous devez utiliser dans plusieurs modules de la suite de tests. Je ne l'utilise pas réellement top
mais il pourrait être utilisé là-bas, si nécessaire.
Je noterai ici que le beforeEach
exécutera son code avant chaque test enregistré avec it
s'ils apparaissent à l'intérieur du describe
in top
ou dans l' un des modules importés . Avec--recursive
, le beforeEach
code devrait être copié dans chaque module ou peut-être auriez-vous un beforeEach
hook dans chaque module qui appelle une fonction importée d'un module commun.
De plus, le after
hook s'exécutera après tous les tests de la suite. Cela ne peut pas être répliqué avec --recursive
. Si vous utilisez --recursive
et 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- top
tête ne peut pas être répliqué à l'aide de --recursive
. Avec --recursive
chaque fichier pourrait avoirdescribe("top"
mais cela créerait un nouveau top
titre 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é common
comme celui-ci est quelque chose que j'ai fait dans certaines de mes suites de tests pour éviter d'avoir à faire require
un 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 () {});