Wenn Sie mehrere Module in Ihre describeHierarchie aufnehmen möchten, wie Sie es in Ihrer Frage tun, tun Sie dies so ziemlich, es sei denn, Sie möchten einen benutzerdefinierten Testlader für Mocha schreiben. Das Schreiben des benutzerdefinierten Loaders wäre nicht einfacher oder macht Ihren Code klarer als das, was Sie bereits haben.
Hier ist ein Beispiel, wie ich ein paar Dinge ändern würde. Das testUnterverzeichnis in diesem Beispiel ist wie folgt organisiert:
.
└── 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");
});
});
Die importTestFunktion soll nur zeigen, wie es möglich wäre, die Wiederholung des Imports mehrerer Module zu handhaben, ohne das describe(... require...Ganze jedes Mal neu eingeben zu müssen . Das commonModul soll enthalten, was Sie in mehreren Modulen der Testsuite verwenden müssen. Ich benutze es nicht wirklich intop aber es könnte dort verwendet werden, wenn nötig.
Ich werde hier bemerken, dass der beforeEachCode vor jedem einzelnen Test ausgeführt wird, der registriert wird, itob er im describeIn topoder in einem der importierten Module erscheint . Mit müsste --recursiveder beforeEachCode in jedes Modul kopiert werden, oder Sie hätten beforeEachin jedem Modul einen Hook, der eine aus einem gemeinsamen Modul importierte Funktion aufruft.
Außerdem wird der afterHook nach allen Tests in der Suite ausgeführt. Dies kann nicht mit repliziert werden --recursive. Wenn Sie --recursiveden Code afterjedes Moduls verwenden und hinzufügen , wird er einmal pro Modul und nicht nur einmal für das gesamte Modul ausgeführt Test ausgeführt.
Wenn alle Tests unter einer einzigen topÜberschrift angezeigt werden, kann dies nicht mit repliziert werden --recursive. Mit --recursivejeder Datei könnte describe("top"aber dies würde eine neue topÜberschrift für jede Datei erstellen.
common.js::
var chai = require("chai");
var options = {
foo: "foo"
};
exports.options = options;
exports.chai = chai;
exports.assert = chai.assert;
Die Verwendung eines Moduls mit commondiesem Namen habe ich in einigen meiner Testsuiten durchgeführt, um zu vermeiden, dass immer wieder requireeine Menge Dinge erledigt werden müssen, und um globale schreibgeschützte Variablen oder Funktionen zu speichern, die den Status nicht beibehalten. Ich ziehe es vor, das nicht zu verschmutzenglobal Objekt nicht wie in der Antwort von thgaskell , da dieses Objekt wirklich global ist und auch in Bibliotheken von Drittanbietern zugänglich ist, in die Ihr Code möglicherweise geladen wird. Dies ist in meinem Code nicht akzeptabel.
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 () {});