lib/reporters/xunit.js
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');
      }

      mkdirp.sync(path.dirname(options.reporterOptions.output));
      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>');
  });
}
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');
      }

      mkdirp.sync(path.dirname(options.reporterOptions.output));
      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>');
  });
}
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' ) ; } mkdirp . sync ( path . dirname ( options . reporterOptions . output ) ) ; 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
Constructs a new XUnit reporter instance .