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
_ファイルにロードできますか?
Mochaには、他のファイルの前にロードされるhelper.js
という名前の特殊ファイルの概念はありません。
mocha --recursive
を実行すると、Mochahappensがファイルをロードする順序のため、あなたがしようとしていることは機能します。 helper.js
は他のファイルより1レベル高いため、最初にロードされます。 Mochaに個別のファイルを指定すると、Mochaはこのファイルをロードするだけで、発見したように、helper.js
ファイルはロードされません。すべて。
したがって、あなたがしたいことは、トップレベル(「グローバル」)フック(before
、after
など)を設定するようにファイルをロードすることです。オプション:
Mochaプログラムで を使用して、必要な順序でファイルをフィードできます。
他のファイルをリストする前に、コマンドラインでヘルパーファイルを常に指定するように強制することができますfirst。 (私はこれをしませんが、可能です。)
別のオプションは、 this answer で詳しく説明したように、スイートを整理することです。基本的に、スイートの残りの部分をロードする「トップレベル」ファイルが1つあります。この方法を使用すると、個々のファイルでMochaを実行する機能が失われますが、--grep
を使用して実行するものを選択できます。
あなたはcannot-r
オプションを使用できません。スイートを実行する前にモジュールをロードしますが、残念ながら、ロードされたモジュールは、Mochaがテストに使用できるテストインターフェイスにアクセスできないため、フックを設定できません。
まず、mocha.opts
を間違いなく使用して、毎回必要なオプションを含める必要がないようにします。指摘されているように、1つのオプションは--grep
を使用することですが、私は個人的にはそれほど大ファンではありません。すべてを非常に単純な方法で命名する必要がありました。 before
フックが非同期でない場合、--require
でmocha.opts
を使用できます。例えば.
#mocha.opts
--recursive
--require test/helpers.js
グローバルafter
フックも必要なため、これはうまくいかないようです。私がやったことは、毎回完全なテストスイートを呼び出すだけですが、開発の途中で1つのスイート、または1つの特定のテストさえテストしたい場合は、排他機能、only
を使用します https://mochajs.org/#exclusive-tests 。 it.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
フックをそこに配置すると、そのディレクトリ内のテストだけでなく、すべてのテストの前に起動します。
とにかく、私はこの投稿が少し古いことを知っていますが、これが他の同様の問題を抱えている人を助けることを願っています。
私がしているのは、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
あらゆる種類のテストを行ってデータベースに一度接続してからcrud
でmodels
テストを実行する前にこの質問に答えました。
次に、 mocha-prepare を見つけて、問題を解決しました。
あなたのhelper.js
ファイルでは、prepare
関数を定義するだけです。
prepare(done => {
console.log('do something asynchronously here')
done()
}, done => {
console.log('asynchronously clean up after here')
done()
})
御works走。
このプロジェクトでは、次のようなヘルパーを使用しています。
clientHelper = require("../../../utils/clientHelper")
ヘルパーの相対パスを適切に構成する必要があります。
そして、次のように呼び出します:
clientHelper.setCompanyId(clientId)