私は、次のような複数のファイルのすべてのテストを1つのファイルに結合しようとしています。
describe('Controllers', function() {
describe('messages.js', function() {
require('./controllertests/messages').test(options);
})
describe('users.js', function() {
require('./controllertests/users').test(options);
})
})
これはテストに参加する最良の方法ではないと確信しています。これを行う方法の例を見つけるのが難しいです:s
複数のモジュールをあなたの質問で行っているdescribe
階層に含めたい場合、あなたがしていることはほとんどitです、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
フックが各モジュールにある場合があります。
また、スイートのallテストの後にafter
フックが実行されます。これは--recursive
で複製できません。 --recursive
を使用してafter
のコードを各モジュールに追加すると、wholeテストではなく、モジュールごとに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
という名前のmoduleを使用することは、いくつかのテストスイートでrequire
を大量に使用することを避けるために行ったことです。オーバーして、グローバルを保持する読み取り専用状態を保持しない変数または関数。 thgaskellの答えのようにglobal
オブジェクトを汚染しないことをお勧めします。このオブジェクトは、コードがロードしているサードパーティライブラリでも真にグローバルでアクセスできるためです。これは私のコードで受け入れられるものではありません。
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 () {});
これは質問に直接リンクしていないかもしれませんが、私が探していた答えは次のとおりでした:
$ mocha --recursive
「test」フォルダーのサブディレクトリですべてのテストを実行します。きちんとした。ロードしたいテストのリストを維持し、実際には常にすべてを実行する必要がなくなります。
複数のテストファイルの実行を妨げるものは何もありません。一般に、各テストは別のテストの結果に依存するべきではないので、変数を共有することは望んでいることではありません。
テストファイルを整理する方法の例を次に示します。
.
├── app.js
└── test
├── common.js
├── mocha.opts
│
├── controllers
│ ├── messages-controller.js
│ └── users-controller.js
│
└── modles
├── messages-model.js
└── users-model.js
次に、mocha.opts
ファイル内で、--recursive
オプションを設定してください。
mocha.opts
--ui bdd
--recursive
すべてのファイルに含めるare共通モジュールがある場合は、common.js
ファイルに追加できます。 test
ディレクトリのルートにあるファイルは、ネストされたディレクトリ内のファイルの前に実行されます。
common.js
global.chai = require('chai');
global.assert = chai.assert;
global.expect = chai.expect;
chai.should();
chai.config.includeStack = true;
process.env.NODE_ENV = 'test';
// Include common modules from your application that will be used among multiple test suites.
global.myModule = require('../app/myModule');
私はこれが古い投稿であることを知っていますが、OPが提案する方法と非常によく似た、私にとって良い解決策であるものに触れたいと思いました。
私が取り組んでいるプロジェクトは十分にテストされており、テストは成長し続けています。私はrequire
を使用することになりました。これは同期であるため、アーキテクチャをあまり変更せずにテストを作成するのが少し簡単になるためです。
// inside test/index.js
describe('V1 ROUTES', () => {
require('./controllers/claims.test');
require('./controllers/claimDocuments.test');
require('./controllers/claimPhotos.test');
require('./controllers/inspections.test');
require('./controllers/inspectionPhotos.test');
require('./controllers/versions.test');
require('./services/login.v1.test');
});
describe('V2 ROUTES', () => {
require('./services/login.v2.test');
require('./services/dec-image.v2.test');
});
describe('V3 ROUTES', () => {
require('./services/login.v3.test');
require('./services/getInspectionPhotosv3.test');
require('./services/getPolicyInfo.v3.test');
});
describe('ACTIONS', () => {
require('./actions/notifications.test');
});