Se você deseja incluir vários módulos em sua describehierarquia como está fazendo em sua pergunta, o que você está fazendo é basicamente isso , a menos que queira escrever um carregador de teste personalizado para o Mocha. Escrever o carregador personalizado não seria mais fácil ou tornaria seu código mais claro do que o que você já possui.
Aqui está um exemplo de como eu mudaria algumas coisas. O testsubdiretório neste exemplo é organizado como:
.
└── 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");
});
});
A importTestfunção é apenas mostrar como seria possível lidar com a repetição de importação de vários módulos sem ter que redigitar describe(... require...tudo a cada vez. O commonmódulo destina-se a conter o que você precisa usar em vários módulos do conjunto de testes. Na verdade, não estou usando, topmas pode ser usado lá, se necessário.
Notarei aqui que o beforeEachexecutará seu código antes de cada teste registrado com itse eles aparecem dentro do describeem topou em algum dos módulos importados . Com --recursive, o beforeEachcódigo teria que ser copiado em cada módulo ou talvez você tivesse um beforeEachgancho em cada módulo que chama uma função importada de um módulo comum.
Além disso, o aftergancho será executado após todos os testes do conjunto. Isso não pode ser replicado com --recursive. Se você usar --recursivee adicionar o código de aftera cada módulo, ele será executado uma vez por módulo em vez de apenas uma vez para todo o teste.
Fazer com que todos os testes apareçam sob um único toptítulo não pode ser replicado usando --recursive. Com --recursivecada arquivo poderia ter, describe("top"mas isso criaria um novo toptítulo para cada arquivo.
common.js:
var chai = require("chai");
var options = {
foo: "foo"
};
exports.options = options;
exports.chai = chai;
exports.assert = chai.assert;
Usar um módulo denominado commoncomo este é algo que fiz em alguns dos meus conjuntos de teste para evitar ter de requireum monte de coisas repetidamente e manter variáveis globais somente leitura ou funções que não mantêm o estado. Eu prefiro não poluir o globalobjeto como na resposta de thgaskell porque este objeto é realmente global e acessível mesmo em bibliotecas de terceiros que seu código pode estar carregando. Isso não é algo que considero aceitável em meu código.
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 () {});