Wenn Sie mehrere Module in Ihre describe
Hierarchie 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 test
Unterverzeichnis 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 importTest
Funktion 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 common
Modul 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 beforeEach
Code vor jedem einzelnen Test ausgeführt wird, der registriert wird, it
ob er im describe
In top
oder in einem der importierten Module erscheint . Mit müsste --recursive
der beforeEach
Code in jedes Modul kopiert werden, oder Sie hätten beforeEach
in jedem Modul einen Hook, der eine aus einem gemeinsamen Modul importierte Funktion aufruft.
Außerdem wird der after
Hook nach allen Tests in der Suite ausgeführt. Dies kann nicht mit repliziert werden --recursive
. Wenn Sie --recursive
den Code after
jedes 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 --recursive
jeder 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 common
diesem Namen habe ich in einigen meiner Testsuiten durchgeführt, um zu vermeiden, dass immer wieder require
eine 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 () {});