教程:创建自定义报告器

创建自定义报告器

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 将 stats 属性(类型为 StatsCollector)添加到报告器的 Runner 实例(作为第一个参数传递给构造函数)。

事件

报告器应监听从 runnerRunner 的单例实例)发出的事件。

事件名称从 Mocha.Runnerconstants 属性导出

常量事件名称事件参数描述
EVENT_RUN_BEGIN开始(n/a)执行将开始。
EVENT_RUN_END结束(n/a)所有 套件测试钩子 已完成执行。
EVENT_DELAY_BEGIN等待(n/a)等待 global.run() 被调用;仅在 延迟 选项为 true 时发出。
EVENT_DELAY_END准备就绪(n/a)用户调用了 global.run(),根套件已准备好执行。
EVENT_SUITE_BEGIN套件套件将执行 钩子测试,包括任何嵌套的 套件
EVENT_SUITE_END套件结束套件钩子测试套件 内的嵌套 套件 已完成执行。
EVENT_HOOK_BEGIN钩子钩子将执行 钩子
EVENT_HOOK_END钩子结束钩子钩子 已完成执行。
EVENT_TEST_BEGIN测试测试将执行 测试
EVENT_TEST_END测试结束测试测试 已完成执行。
EVENT_TEST_FAIL失败测试错误测试 失败或抛出异常。
EVENT_TEST_PASS通过测试测试 已通过。
EVENT_TEST_PENDING待定测试测试 被跳过。
EVENT_TEST_RETRY重试测试错误测试 失败,但即将重试;仅在 retry 选项不为零时发出。

请使用这些常量,而不是您自己的报告器中的事件名称!这将确保与 Mocha 的未来版本兼容。

重要的是要了解,所有 Suite 回调将在 Runner 发出 EVENT_RUN_BEGIN 之前 运行。钩子和测试将在 Runner 发出 EVENT_RUN_BEGIN 之后 运行。