Jeśli chcesz dołączyć wiele modułów do swojej describe
hierarchii, 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. test
Podkatalogu 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");
});
});
importTest
Funkcja 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. common
Moduł ten służy do przechowywania, czego potrzebujesz do korzystania z wielu modułów zestawu testowego. W rzeczywistości nie używam go, top
ale w razie potrzeby można go tam użyć.
W tym miejscu zauważę, że program beforeEach
uruchomi swój kod przed każdym zarejestrowanym testem z informacją, it
czy pojawiają się one w programie describe
in, top
czy też pojawiają się w którymkolwiek z zaimportowanych modułów . Dzięki --recursive
temu beforeEach
kod musiałby zostać skopiowany do każdego modułu lub być może w każdym module byłby punkt beforeEach
zaczepienia, który wywołuje funkcję zaimportowaną ze wspólnego modułu.
Ponadto after
hak zostanie uruchomiony po wszystkich testach w pakiecie. Nie można tego powtórzyć za pomocą --recursive
. Jeśli użyjesz --recursive
i dodasz kod after
do 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 top
nagłówkiem nie można powielić za pomocą --recursive
. Z --recursive
każdego pliku może mieć describe("top"
, ale to byłoby utworzyć nowy top
nagłó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 common
takiej nazwie jest czymś, co zrobiłem w niektórych moich zestawach testowych, aby uniknąć konieczności ciągłego require
wykonywania wielu rzeczy i utrzymywania globalnych zmiennych tylko do odczytu lub funkcji, które nie zachowują stanu. Wolę nie zanieczyszczać global
obiektu, 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 () {});