Ответ 1
Если вы хотите включить несколько модулей в свою иерархию 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
, будут ли они отображаться внутри describe
в top
или появляться в любом из импортированных модулей. С помощью --recursive
код beforeEach
должен быть скопирован в каждый модуль или, возможно, в каждом модуле будет крюк beforeEach
, который вызывает функцию, импортированную из общего модуля.
Кроме того, хук after
запускается после тестов all в пакете. Это не может быть реплицировано с помощью --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 () {});