function XUnit(runner, options) {
    Base.call(this, runner, options);

    var stats = this.stats;
    var tests = [];
    var self = this;

    // the name of the test suite, as it will appear in the resulting XML file
    var suiteName;

    // the default name of the test suite if none is provided
    var DEFAULT_SUITE_NAME = 'Mocha Tests';

    if (options && options.reporterOptions) {
      if (options.reporterOptions.output) {
        if (!fs.createWriteStream) {
          throw createUnsupportedError('file output not supported in browser');
        }

        fs.mkdirSync(path.dirname(options.reporterOptions.output), {
          recursive: true
        });
        self.fileStream = fs.createWriteStream(options.reporterOptions.output);
      }

      // get the suite name from the reporter options (if provided)
      suiteName = options.reporterOptions.suiteName;
    }

    // fall back to the default suite name
    suiteName = suiteName || DEFAULT_SUITE_NAME;

    runner.on(EVENT_TEST_PENDING, function (test) {
      tests.push(test);
    });

    runner.on(EVENT_TEST_PASS, function (test) {
      tests.push(test);
    });

    runner.on(EVENT_TEST_FAIL, function (test) {
      tests.push(test);
    });

    runner.once(EVENT_RUN_END, function () {
      self.write(
        tag(
          'testsuite',
          {
            name: suiteName,
            tests: stats.tests,
            failures: 0,
            errors: stats.failures,
            skipped: stats.tests - stats.failures - stats.passes,
            timestamp: new Date().toUTCString(),
            time: stats.duration / 1000 || 0
          },
          false
        )
      );

      tests.forEach(function (t) {
        self.test(t);
      });

      self.write('</testsuite>');
    });
  }
Constructs a new `XUnit` reporter instance.

@public
@class
@memberof Mocha.reporters
@extends Mocha.reporters.Base
@param {Runner} runner - Instance triggers reporter actions.
@param {Object} [options] - runner options