Se você deseja incluir vários módulos em sua describe
hierarquia 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 test
subdiretó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 importTest
funçã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 common
mó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, top
mas pode ser usado lá, se necessário.
Notarei aqui que o beforeEach
executará seu código antes de cada teste registrado com it
se eles aparecem dentro do describe
em top
ou em algum dos módulos importados . Com --recursive
, o beforeEach
código teria que ser copiado em cada módulo ou talvez você tivesse um beforeEach
gancho em cada módulo que chama uma função importada de um módulo comum.
Além disso, o after
gancho será executado após todos os testes do conjunto. Isso não pode ser replicado com --recursive
. Se você usar --recursive
e adicionar o código de after
a 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 top
título não pode ser replicado usando --recursive
. Com --recursive
cada arquivo poderia ter, describe("top"
mas isso criaria um novo top
tí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 common
como este é algo que fiz em alguns dos meus conjuntos de teste para evitar ter de require
um 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 global
objeto 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 () {});