Mochaでは、`npm` を介してインストールできるカスタムレポーターを定義して使用できます。
例えば、`mocha-foo-reporter` がnpmレジストリに公開されている場合、`npm install mocha-foo-reporter --save-dev`でインストールし、`mocha --reporter mocha-foo-reporter`で使うことができます。
カスタムレポーターの例
すぐに始めたい場合は、カスタムレポーターの例を以下に示します。
// my-reporter.js
'use strict';
const Mocha = require('mocha');
const {
EVENT_RUN_BEGIN,
EVENT_RUN_END,
EVENT_TEST_FAIL,
EVENT_TEST_PASS,
EVENT_SUITE_BEGIN,
EVENT_SUITE_END
} = Mocha.Runner.constants;
// this reporter outputs test results, indenting two spaces per suite
class MyReporter {
constructor(runner) {
this._indents = 0;
const stats = runner.stats;
runner
.once(EVENT_RUN_BEGIN, () => {
console.log('start');
})
.on(EVENT_SUITE_BEGIN, () => {
this.increaseIndent();
})
.on(EVENT_SUITE_END, () => {
this.decreaseIndent();
})
.on(EVENT_TEST_PASS, test => {
// Test#fullTitle() returns the suite name(s)
// prepended to the test title
console.log(`${this.indent()}pass: ${test.fullTitle()}`);
})
.on(EVENT_TEST_FAIL, (test, err) => {
console.log(
`${this.indent()}fail: ${test.fullTitle()} - error: ${err.message}`
);
})
.once(EVENT_RUN_END, () => {
console.log(`end: ${stats.passes}/${stats.passes + stats.failures} ok`);
});
}
indent() {
return Array(this._indents).join(' ');
}
increaseIndent() {
this._indents++;
}
decreaseIndent() {
this._indents--;
}
}
module.exports = MyReporter;
このレポーターを使用するには、`mocha --reporter /path/to/my-reporter.js`を実行します。
さらに例については、組み込みのレポーターの実装が最適な場所です。統合テストも役立つ場合があります。
Base
レポータークラス
Baseは「抽象」クラスです。コンソール固有の設定とユーティリティを含んでおり、組み込みレポーターで一般的に使用されます。組み込みレポーターの実装を参照すると、多くの場合、Baseの静的プロパティが参照されていることがわかります。
カスタムレポーターがBaseを拡張することは、多くの場合役立ちますが、必須ではありません。
統計情報
Mochaは、レポーターの`Runner`インスタンス(コンストラクターの最初の引数として渡される)に、StatsCollector型の`stats`プロパティを追加します。
イベント
レポーターは、`runner`(Runnerのシングルトンインスタンス)から発行されるイベントをリッスンする必要があります。
イベント名は、`Mocha.Runner`の`constants`プロパティからエクスポートされます。
定数 | イベント名 | イベント引数 | 説明 |
---|---|---|---|
EVENT_RUN_BEGIN | start | (n/a) | 実行が開始されます。 |
EVENT_RUN_END | end | (n/a) | すべてのスイート、テスト、フックの実行が完了しました。 |
EVENT_DELAY_BEGIN | waiting | (n/a) | delayオプションが`true`の場合にのみ発行されます。`global.run()`が呼び出されるのを待っています。 |
EVENT_DELAY_END | ready | (n/a) | ユーザーが`global.run()`を呼び出し、ルートスイートが実行準備ができました。 |
EVENT_SUITE_BEGIN | suite | Suite | スイート内のフックとテストが実行されます。ネストされたスイートも含まれます。 |
EVENT_SUITE_END | suite end | Suite | スイート内のフック、テスト、およびネストされたスイートの実行が完了しました。 |
EVENT_HOOK_BEGIN | hook | フック | フックが実行されます。 |
EVENT_HOOK_END | hook end | フック | フックの実行が完了しました。 |
EVENT_TEST_BEGIN | test | Test | テストが実行されます。 |
EVENT_TEST_END | test end | Test | テストの実行が完了しました。 |
EVENT_TEST_FAIL | fail | Test , Error | テストが失敗したか、例外をスローしました。 |
EVENT_TEST_PASS | pass | Test | テストがパスしました。 |
EVENT_TEST_PENDING | pending | Test | テストがスキップされました。 |
EVENT_TEST_RETRY | retry | Test , Error | テストが失敗しましたが、再試行されようとしています。`retry`オプションがゼロ以外の場合にのみ発行されます。 |
独自のレポーターでは、これらの定数を使用してください。これにより、Mochaの将来のバージョンとの互換性が確保されます。
すべての`Suite`コールバックは、Runnerが`EVENT_RUN_BEGIN`を発行する前に実行されることに注意することが重要です。フックとテストは、Runnerが`EVENT_RUN_BEGIN`を発行した後に実行されます。