Якщо ви хочете включити у свою 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 () {});