Jeśli chcesz dołączyć wiele modułów do swojej describehierarchii, tak jak robisz to w swoim pytaniu, to, co robisz, jest prawie tym , chyba że chcesz napisać niestandardowy program ładujący test dla Mocha. Napisanie niestandardowego modułu ładującego nie byłoby łatwiejsze ani nie uczyniłoby kodu bardziej przejrzystym niż to, co już masz.
Oto przykład, jak zmieniłbym kilka rzeczy. testPodkatalogu w tym przykładzie jest organizowane jako:
.
└── 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");
});
});
importTestFunkcja jest po prostu pokazać, jak to będzie możliwe, aby poradzić sobie z powtórzeniem importowania wielu modułów bez konieczności ponownego wpisywania cały describe(... require...rzeczą każdym razem. commonModuł ten służy do przechowywania, czego potrzebujesz do korzystania z wielu modułów zestawu testowego. W rzeczywistości nie używam go, topale w razie potrzeby można go tam użyć.
W tym miejscu zauważę, że program beforeEachuruchomi swój kod przed każdym zarejestrowanym testem z informacją, itczy pojawiają się one w programie describein, topczy też pojawiają się w którymkolwiek z zaimportowanych modułów . Dzięki --recursivetemu beforeEachkod musiałby zostać skopiowany do każdego modułu lub być może w każdym module byłby punkt beforeEachzaczepienia, który wywołuje funkcję zaimportowaną ze wspólnego modułu.
Ponadto afterhak zostanie uruchomiony po wszystkich testach w pakiecie. Nie można tego powtórzyć za pomocą --recursive. Jeśli użyjesz --recursivei dodasz kod afterdo każdego modułu, będzie on wykonywany raz na moduł, a nie tylko raz na cały test.
Wyświetlenia wszystkich testów pod pojedynczym topnagłówkiem nie można powielić za pomocą --recursive. Z --recursivekażdego pliku może mieć describe("top", ale to byłoby utworzyć nowy topnagłówek dla każdego pliku.
common.js:
var chai = require("chai");
var options = {
foo: "foo"
};
exports.options = options;
exports.chai = chai;
exports.assert = chai.assert;
Używanie modułu o commontakiej nazwie jest czymś, co zrobiłem w niektórych moich zestawach testowych, aby uniknąć konieczności ciągłego requirewykonywania wielu rzeczy i utrzymywania globalnych zmiennych tylko do odczytu lub funkcji, które nie zachowują stanu. Wolę nie zanieczyszczać globalobiektu, jak w odpowiedzi thgaskell, ponieważ ten obiekt jest naprawdę globalny i dostępny nawet w bibliotekach stron trzecich, który może ładować twój kod. To nie jest coś, co uważam za akceptowalne w moim kodzie.
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 () {});