web-dev-qa-db-ja.com

グローバルフックまたはユーティリティを定義するhelper.jsファイルをMochaにロードさせるにはどうすればよいですか?

Node.jsアプリでMochaテストを実行するために使用する_test/helper.js_という名前のファイルがあります。私のテスト構造は次のようになります。

_test/
test/helper.js    # global before/after
test/api/sometest.spec.js
test/models/somemodel.spec.js
... more here
_

ファイル_helper.js_は、テストスイート用のグローバルフックが含まれているため、ロードする必要があります。 Mochaを実行して、次のようにテストスイート全体を実行すると:

_mocha --recursive test/
_

_helper.js_ファイルはテストの前にロードされ、beforeフックは期待どおりに実行されます。

ただし、特定のテストを1つだけ実行すると、テストの前に_helper.js_がロードされません。これは私がそれを実行する方法です:

_mocha test/api/sometest.spec.js
_

グローバルbeforeは呼び出されず、console.log('I WAS HERE');さえも呼び出されません。

それでは、どうすればMochaをalways _helper.js_ファイルにロードできますか?

37
Zlatko

Mochaには、他のファイルの前にロードされるhelper.jsという名前の特殊ファイルの概念はありません。

mocha --recursiveを実行すると、Mochahappensがファイルをロードする順序のため、あなたがしようとしていることは機能します。 helper.jsは他のファイルより1レベル高いため、最初にロードされます。 Mochaに個別のファイルを指定すると、Mochaはこのファイルをロードするだけで、発見したように、helper.jsファイルはロードされません。すべて。

したがって、あなたがしたいことは、トップレベル(「グローバル」)フック(beforeafterなど)を設定するようにファイルをロードすることです。オプション:

  1. Mochaプログラムで を使用して、必要な順序でファイルをフィードできます。

  2. 他のファイルをリストする前に、コマンドラインでヘルパーファイルを常に指定するように強制することができますfirst。 (私はこれをしませんが、可能です。)

  3. 別のオプションは、 this answer で詳しく説明したように、スイートを整理することです。基本的に、スイートの残りの部分をロードする「トップレベル」ファイルが1つあります。この方法を使用すると、個々のファイルでMochaを実行する機能が失われますが、--grepを使用して実行するものを選択できます。

あなたはcannot-rオプションを使用できません。スイートを実行する前にモジュールをロードしますが、残念ながら、ロードされたモジュールは、Mochaがテストに使用できるテストインターフェイスにアクセスできないため、フックを設定できません。

23
Louis

まず、mocha.optsを間違いなく使用して、毎回必要なオプションを含める必要がないようにします。指摘されているように、1つのオプションは--grepを使用することですが、私は個人的にはそれほど大ファンではありません。すべてを非常に単純な方法で命名する必要がありました。 beforeフックが非同期でない場合、--requiremocha.optsを使用できます。例えば.

#mocha.opts
--recursive
--require test/helpers.js

グローバルafterフックも必要なため、これはうまくいかないようです。私がやったことは、毎回完全なテストスイートを呼び出すだけですが、開発の途中で1つのスイート、または1つの特定のテストさえテストしたい場合は、排他機能、onlyを使用します https://mochajs.org/#exclusive-testsit.only('...またはdescribe.only('...にすることができます。これを行うと、すべてのテストを調べ、完全なテストハーネスとまったく同じようにセットアップしますが、指定したテストまたはスイートのみを実行します。

これで、これらのグローバルフックを問題なく含めることができます。 @Louisは、helpers.jsが適切な順序でロードされているのは偶然だと述べています。それは真実ではありません。 describeブロックの外側にフックを配置すると、自動的にグローバルフックになります。これは、独自のファイルに配置することで実現できます

// helpers.js
before(function() { console.log('testing...'); });

またはテストファイル内

// some.spec.js
before(function() { console.log('testing...'); });

describe('Something', function() {
  it('will be tested', function() {
  ...
  });
});

明らかに、それを独自のファイルに入れる方がきれいだと思います。 (私はそれをhooks.jsと呼びました)。ポイントは、これはファイルがロードされた順序の結果ではないということです。

他の人には明らかかもしれない1つの落とし穴がありますが、私は簡単に苦労しました-describeブロックに配置されていないフックはすべてグローバルです。これらはディレクトリ固有ではありません。したがって、helpers.jsをテストのサブディレクトリにコピーすると、beforeおよびafterフックが2回起動します。また、beforeEachフックをそこに配置すると、そのディレクトリ内のテストだけでなく、すべてのテストの前に起動します。

とにかく、私はこの投稿が少し古いことを知っていますが、これが他の同様の問題を抱えている人を助けることを願っています。

16
aray12

私がしているのは、test/test_helper.jsファイル。作成したすべてのヘルパーをエクスポートします。

// test/test_helper.js    
module.exports = {
    MyHelper: require('./helpers/MyHelper')
}

次に、使用する必要があるテストのヘルパーrequireを使用します。

// test/spec/MySpec.js
var helper = require('../test_helper');

// Or if you need just "MyHelper"
var myHelper = require('../test_helper').MyHelper;

describe('MySpec', function () {
   // Tests here...
});

理解しやすく、柔軟であるため、上記のアプローチを好みます。デモで実際に動作を確認できます: https://github.com/paulredmond/karma-browserify-demo/tree/master/test

15
Paul Redmond

あらゆる種類のテストを行ってデータベースに一度接続してからcrudmodelsテストを実行する前にこの質問に答えました。

次に、 mocha-prepare を見つけて、問題を解決しました。

あなたのhelper.jsファイルでは、prepare関数を定義するだけです。

prepare(done => {
  console.log('do something asynchronously here')
  done()
}, done => {
  console.log('asynchronously clean up after here')
  done()
})

御works走。

3
Dave Sag

このプロジェクトでは、次のようなヘルパーを使用しています。

clientHelper = require("../../../utils/clientHelper")

ヘルパーの相対パスを適切に構成する必要があります。

そして、次のように呼び出します:

clientHelper.setCompanyId(clientId)
0
Divjot Singh