18

最近、mocha を使用して Expressjs サーバーをテストする作業を開始しました。私のテストは複数のファイルに分割されており、それらのほとんどにはいくつかの重複したセグメントが含まれています (ほとんどの場合、すべてのフィクスチャを DB にロードする前のステートメントなど)。これは本当に面倒です。

それらすべてを単一のファイルにエクスポートして、すべてのテストでインポートすることもできると思いますが、すべてのセットアップコマンドを含む特定のファイルを実行し、すべてを含む別のファイルを実行するなど、より洗練されたソリューションがあるかどうか疑問に思います分解コマンド。

誰かが素晴らしい答えを知っていれば:)

4

2 に答える 2

21

mocha テストの一般的な機能を除外するには、3 つの基本的なレベルがあります。一連のテストのためにいくつかのフィクスチャを 1 回ロードする場合 (そして、各テストを独立して記述した場合)、before関数を使用して、ファイルの先頭にあるフィクスチャをロードします。beforeEachフィクスチャを毎回再初期化する必要がある場合は、 functionを使用することもできます。

2 番目のオプション (これは関連しています) は、一般的な機能を別のファイルまたはファイルのセットに引き出し、そのファイルを必要とすることです。

最後に、mocha にはルート レベルのフックがあることに注意してください。

任意のファイルを選択して、「ルート」レベルのフックを追加することもできます。たとえば、すべての describe() ブロックの外側に beforeEach() を追加します。これにより、 beforeEach() へのコールバックが、それが存在するファイルに関係なく、テスト ケースの前に実行されます (これは、Mocha には「ルート スイート」と呼ばれる暗黙の describe() ブロックがあるためです)。

これを使用して Express サーバーを 1 回起動します (また、開発サーバーとは異なるポートで実行されるように環境変数を使用します)。

before(function () {
  process.env.NODE_ENV = 'test';
  require('../../app.js');
});

(require は同期的であるため、ここでは は必要ありませんdone()。) これは、このルートレベルのbefore関数が含まれる異なるテスト ファイルの数に関係なく、サーバーは 1 回だけ起動されるというものでした。

このように物事を分割する利点は、npm testすべてのテストを実行するか、特定のファイルまたは特定のフォルダー、または特定のテストまたは一連のテスト (it.only および describe.only を使用) に対して mocha を実行できることです。選択したテストのすべての前提条件が実行されます。

于 2013-09-07T16:00:37.897 に答える
12

なぜ、mocha -r <module>または使用しないのmocha.optsですか?

共通ファイルを入れて、たとえば、init.js実行します

mocha -r `./init`

./init.jsこれにより、mocha テスト ファイルをロードする前にmocha が実行およびロードされます。

mocha.optsテストディレクトリ内に配置して、その内容を次のようにすることもできます

--require ./init
于 2013-09-08T07:04:40.163 に答える