diff --git a/lib/reporters/base.js b/lib/reporters/base.js index e5ed0d4c61..ea259445e3 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -154,14 +154,14 @@ exports.cursor = { } }; -function showDiff(err) { +var showDiff = (exports.showDiff = function(err) { return ( err && err.showDiff !== false && sameType(err.actual, err.expected) && err.expected !== undefined ); -} +}); function stringifyDiffObjs(err) { if (!utils.isString(err.actual) || !utils.isString(err.expected)) { @@ -182,9 +182,19 @@ function stringifyDiffObjs(err) { * @return {string} Diff */ var generateDiff = (exports.generateDiff = function(actual, expected) { - return exports.inlineDiffs - ? inlineDiff(actual, expected) - : unifiedDiff(actual, expected); + try { + return exports.inlineDiffs + ? inlineDiff(actual, expected) + : unifiedDiff(actual, expected); + } catch (err) { + var msg = + '\n ' + + color('diff added', '+ expected') + + ' ' + + color('diff removed', '- actual: failed to generate Mocha diff') + + '\n'; + return msg; + } }); /** diff --git a/lib/reporters/xunit.js b/lib/reporters/xunit.js index 6c9c937be8..da366cdaa1 100644 --- a/lib/reporters/xunit.js +++ b/lib/reporters/xunit.js @@ -163,9 +163,9 @@ XUnit.prototype.test = function(test) { if (test.state === STATE_FAILED) { var err = test.err; var diff = - Base.hideDiff || !err.actual || !err.expected - ? '' - : '\n' + Base.generateDiff(err.actual, err.expected); + !Base.hideDiff && Base.showDiff(err) + ? '\n' + Base.generateDiff(err.actual, err.expected) + : ''; this.write( tag( 'testcase', diff --git a/test/reporters/xunit.spec.js b/test/reporters/xunit.spec.js index 2d05312fae..736f9d1112 100644 --- a/test/reporters/xunit.spec.js +++ b/test/reporters/xunit.spec.js @@ -350,6 +350,42 @@ describe('XUnit reporter', function() { ''; expect(expectedWrite, 'to be', expectedTag); }); + + it('should handle non-string diff values', function() { + var runner = new EventEmitter(); + createStatsCollector(runner); + var xunit = new XUnit(runner); + + var expectedTest = { + state: STATE_FAILED, + title: expectedTitle, + parent: { + fullTitle: function() { + return expectedClassName; + } + }, + duration: 1000, + err: { + actual: 1, + expected: 2, + message: expectedMessage, + stack: expectedStack + } + }; + + sandbox.stub(xunit, 'write').callsFake(function(str) { + expectedWrite += str; + }); + + runner.emit(EVENT_TEST_FAIL, expectedTest, expectedTest.err); + runner.emit(EVENT_RUN_END); + sandbox.restore(); + + var expectedDiff = + '\n + expected - actual\n\n -1\n +2\n '; + + expect(expectedWrite, 'to contain', expectedDiff); + }); }); describe('on test pending', function() {