あなたが複数のモジュールを含める場合に、あなたのdescribe、あなたの質問にやっているように、階層、何をやっていることはほとんどありそれあなたがモカのためのカスタムテストローダを書きたい場合を除き、。カスタムローダーの作成は、既存のものよりも簡単ではなく、コードを明確にすることもできません。
これが私がいくつかのことを変える方法の例です。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て各モジュールに追加すると、テスト全体で1回だけではなく、モジュールごとに1回実行されます。
すべてのテストを単一の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 () {});