Если вы хотите включить несколько модулей в свою describeиерархию, как вы это делаете в своем вопросе, то, что вы делаете, в значительной степени это , если вы не хотите написать собственный тестовый загрузчик для Mocha. Написание собственного загрузчика не будет проще и не сделает ваш код более понятным, чем тот, который у вас уже есть.
Вот пример того, как я бы изменил несколько вещей. testПодкаталог в этом примере организован следующим образом:
.
└── 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Функция просто чтобы показать , как можно было бы обрабатывать повторение импорта нескольких модулей без необходимости перепечатывать в целом describe(... require...вещь каждый раз. commonМодуль предназначен для хранения , что вам нужно использовать в нескольких модулях тестового набора. На самом деле я его не использую, topно при необходимости его можно использовать там.
Я отмечу здесь, что он beforeEachбудет запускать свой код перед каждым тестом, зарегистрированным в itзависимости от того, появляются ли они внутри describein topили они появляются в любом из импортированных модулей . При --recursiveэтом beforeEachкод нужно было бы скопировать в каждый модуль или, возможно, у вас был бы beforeEachкрючок в каждом модуле, который вызывает функцию, импортированную из общего модуля.
Кроме того, afterловушка запускается после всех тестов в наборе. Это не может быть воспроизведено с помощью --recursive. Если вы используете --recursiveи добавляете код afterдля каждого модуля, он будет выполняться один раз для каждого модуля, а не один раз для всего теста.
Отображение всех тестов под одним topзаголовком невозможно воспроизвести с помощью --recursive. С --recursiveкаждым файлом можно было бы иметь, describe("top"но это создало бы новый topзаголовок для каждого файла.
common.js:
var chai = require("chai");
var options = {
foo: "foo"
};
exports.options = options;
exports.chai = chai;
exports.assert = chai.assert;
Использование модуля с таким названием - commonэто то, что я делал в некоторых своих тестовых наборах, чтобы избежать необходимости requireповторять кучу вещей снова и снова и хранить глобальные переменные только для чтения или функции, которые не сохраняют состояние. Я предпочитаю не загрязнять globalобъект, как в ответе thgaskell, потому что этот объект действительно глобален и доступен даже в сторонних библиотеках, которые может загружать ваш код. Я не считаю это приемлемым в моем коде.
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 () {});