Skip to content

Commit 1412dc8

Browse files
rgroothuijsenjuergba
authored andcommitted
XUnit reporter should handle exceptions during diff generation (#4068)
1 parent d9f5079 commit 1412dc8

File tree

3 files changed

+54
-8
lines changed

3 files changed

+54
-8
lines changed

lib/reporters/base.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,14 @@ exports.cursor = {
154154
}
155155
};
156156

157-
function showDiff(err) {
157+
var showDiff = (exports.showDiff = function(err) {
158158
return (
159159
err &&
160160
err.showDiff !== false &&
161161
sameType(err.actual, err.expected) &&
162162
err.expected !== undefined
163163
);
164-
}
164+
});
165165

166166
function stringifyDiffObjs(err) {
167167
if (!utils.isString(err.actual) || !utils.isString(err.expected)) {
@@ -182,9 +182,19 @@ function stringifyDiffObjs(err) {
182182
* @return {string} Diff
183183
*/
184184
var generateDiff = (exports.generateDiff = function(actual, expected) {
185-
return exports.inlineDiffs
186-
? inlineDiff(actual, expected)
187-
: unifiedDiff(actual, expected);
185+
try {
186+
return exports.inlineDiffs
187+
? inlineDiff(actual, expected)
188+
: unifiedDiff(actual, expected);
189+
} catch (err) {
190+
var msg =
191+
'\n ' +
192+
color('diff added', '+ expected') +
193+
' ' +
194+
color('diff removed', '- actual: failed to generate Mocha diff') +
195+
'\n';
196+
return msg;
197+
}
188198
});
189199

190200
/**

lib/reporters/xunit.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,9 @@ XUnit.prototype.test = function(test) {
163163
if (test.state === STATE_FAILED) {
164164
var err = test.err;
165165
var diff =
166-
Base.hideDiff || !err.actual || !err.expected
167-
? ''
168-
: '\n' + Base.generateDiff(err.actual, err.expected);
166+
!Base.hideDiff && Base.showDiff(err)
167+
? '\n' + Base.generateDiff(err.actual, err.expected)
168+
: '';
169169
this.write(
170170
tag(
171171
'testcase',

test/reporters/xunit.spec.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,42 @@ describe('XUnit reporter', function() {
350350
'</failure></testcase>';
351351
expect(expectedWrite, 'to be', expectedTag);
352352
});
353+
354+
it('should handle non-string diff values', function() {
355+
var runner = new EventEmitter();
356+
createStatsCollector(runner);
357+
var xunit = new XUnit(runner);
358+
359+
var expectedTest = {
360+
state: STATE_FAILED,
361+
title: expectedTitle,
362+
parent: {
363+
fullTitle: function() {
364+
return expectedClassName;
365+
}
366+
},
367+
duration: 1000,
368+
err: {
369+
actual: 1,
370+
expected: 2,
371+
message: expectedMessage,
372+
stack: expectedStack
373+
}
374+
};
375+
376+
sandbox.stub(xunit, 'write').callsFake(function(str) {
377+
expectedWrite += str;
378+
});
379+
380+
runner.emit(EVENT_TEST_FAIL, expectedTest, expectedTest.err);
381+
runner.emit(EVENT_RUN_END);
382+
sandbox.restore();
383+
384+
var expectedDiff =
385+
'\n + expected - actual\n\n -1\n +2\n ';
386+
387+
expect(expectedWrite, 'to contain', expectedDiff);
388+
});
353389
});
354390

355391
describe('on test pending', function() {

0 commit comments

Comments
 (0)