Если вы хотите включить несколько модулей в свою 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
in 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 () {});