web-dev-qa-db-ja.com

mocha.jsを使用して複数のファイルからテストに参加する

私は、次のような複数のファイルのすべてのテストを1つのファイルに結合しようとしています。

  describe('Controllers', function() {
    describe('messages.js', function() {
      require('./controllertests/messages').test(options);
    })
    describe('users.js', function() {
      require('./controllertests/users').test(options);
    })
  })

これはテストに参加する最良の方法ではないと確信しています。これを行う方法の例を見つけるのが難しいです:s

77
coiso

複数のモジュールあなたの質問で行っている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で実際には使用していませんが、必要に応じて使用できます。

ここでは、beforeEachitに登録されているすべてのテストの前に、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 () {});
96
Louis

これは質問に直接リンクしていないかもしれませんが、私が探していた答えは次のとおりでした:

$ mocha --recursive

「test」フォルダーのサブディレクトリですべてのテストを実行します。きちんとした。ロードしたいテストのリストを維持し、実際には常にすべてを実行する必要がなくなります。

25
Ian Jamieson

複数のテストファイルの実行を妨げるものは何もありません。一般に、各テストは別のテストの結果に依存するべきではないので、変数を共有することは望んでいることではありません。

テストファイルを整理する方法の例を次に示します。

.
├── 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');
14
thgaskell

私はこれが古い投稿であることを知っていますが、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');
});
4
Mike Fleming