Якщо ви хочете включити у свою 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гачок буде працювати після всіх тестів у наборі. Це неможливо відтворити за допомогою --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 () {});