diff --git a/test/unit/electron/index.js b/test/unit/electron/index.js index 2e7e6442c72..5c8afae039b 100644 --- a/test/unit/electron/index.js +++ b/test/unit/electron/index.js @@ -85,6 +85,12 @@ function importMochaReporter(name) { function deserializeError(err) { const inspect = err.inspect; err.inspect = () => inspect; + if (err.actual) { + err.actual = JSON.parse(err.actual).value; + } + if (err.expected) { + err.expected = JSON.parse(err.expected).value; + } return err; } diff --git a/test/unit/electron/renderer.js b/test/unit/electron/renderer.js index b67ff471e42..a426deca4fe 100644 --- a/test/unit/electron/renderer.js +++ b/test/unit/electron/renderer.js @@ -5,7 +5,7 @@ /*eslint-env mocha*/ -(function() { +(function () { const fs = require('fs'); const originals = {}; let logging = false; @@ -21,7 +21,7 @@ }; function createSpy(element, cnt) { - return function(...args) { + return function (...args) { if (logging) { console.log(`calling ${element}: ` + args.slice(0, cnt).join(',') + (withStacks ? (`\n` + new Error().stack.split('\n').slice(2).join('\n')) : '')); } @@ -213,14 +213,39 @@ function serializeError(err) { return { message: err.message, stack: err.stack, - actual: err.actual, - expected: err.expected, + actual: safeStringify({ value: err.actual }), + expected: safeStringify({ value: err.expected }), uncaught: err.uncaught, showDiff: err.showDiff, inspect: typeof err.inspect === 'function' ? err.inspect() : '' }; } +function safeStringify(obj) { + const seen = new Set(); + return JSON.stringify(obj, (key, value) => { + if (isObject(value) || Array.isArray(value)) { + if (seen.has(value)) { + return '[Circular]'; + } else { + seen.add(value); + } + } + return value; + }); +} + +function isObject(obj) { + // The method can't do a type cast since there are type (like strings) which + // are subclasses of any put not positvely matched by the function. Hence type + // narrowing results in wrong results. + return typeof obj === 'object' + && obj !== null + && !Array.isArray(obj) + && !(obj instanceof RegExp) + && !(obj instanceof Date); +} + class IPCReporter { constructor(runner) {