1. ホーム
  2. node.js

[解決済み] mocha.jsで複数のファイルからテストを結合する

2023-03-10 03:39:39

質問

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

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

これはテストに参加する最良の方法ではないと思いますが、これを行う方法の例を見つけるのに苦労しました :s

どのように解決するのですか?

複数のモジュールをインクルードしたい場合 に含めたい場合 describe のような階層にすることで、あなたがやっていることはほとんど それ であり、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 に表示されるか インポートされたモジュールのいずれかが . と --recursivebeforeEach のコードはそれぞれのモジュールにコピーされなければなりません。 beforeEach フックを各モジュールに置くか、あるいは共通モジュールからインポートされた関数を呼び出すようにします。

また after の後に実行されます。 の後に実行されます。 のテストの後に実行されます。これは --recursive . もし --recursive のコードを追加し after のコードを各モジュールに追加すると、モジュールごとに一度だけ実行されるのではなく、モジュールごとに一度だけ実行されます。 全体 テストに対して一度だけ実行されるのではなく、モジュールごとに一度だけ実行されます。

すべてのテストが単一の 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 このオブジェクトは本当にグローバルで、あなたのコードがロードしているサードパーティライブラリでもアクセス可能だからです。これは、私のコードでは容認できるものではありません。

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 () {});