diff --git a/spec/core/GlobalErrorsSpec.js b/spec/core/GlobalErrorsSpec.js index a8014131..246d8cc4 100644 --- a/spec/core/GlobalErrorsSpec.js +++ b/spec/core/GlobalErrorsSpec.js @@ -98,9 +98,11 @@ describe("GlobalErrors", function() { errors.pushListener(handler); var addedListener = fakeGlobal.process.on.calls.argsFor(0)[1]; - addedListener(new Error('bar')); + const expectedError = new Error('bar'); + addedListener(expectedError); - expect(handler).toHaveBeenCalledWith(new Error('bar')); + expect(handler).toHaveBeenCalledWith(expectedError); + expect(expectedError.jasmineMessage).toBe('Uncaught exception: Error: bar'); errors.uninstall(); @@ -127,10 +129,12 @@ describe("GlobalErrors", function() { errors.pushListener(handler); - var addedListener = fakeGlobal.process.on.calls.argsFor(0)[1]; - addedListener(new Error('bar')); + var addedListener = fakeGlobal.process.on.calls.argsFor(1)[1]; + const expectedError = new Error('bar'); + addedListener(expectedError); - expect(handler).toHaveBeenCalledWith(new Error('bar')); + expect(handler).toHaveBeenCalledWith(expectedError); + expect(expectedError.jasmineMessage).toBe('Unhandled promise rejection: Error: bar'); errors.uninstall(); diff --git a/spec/core/integration/EnvSpec.js b/spec/core/integration/EnvSpec.js index dc690984..945d80c6 100644 --- a/spec/core/integration/EnvSpec.js +++ b/spec/core/integration/EnvSpec.js @@ -1942,10 +1942,10 @@ describe("Env integration", function() { reporter.jasmineDone.and.callFake(function() { expect(reporter.suiteDone).toHaveFailedExpectationsForRunnable('async suite', [ - /^(((Uncaught )?Error: suite( thrown)?)|(suite thrown))$/ + /^(((Uncaught )?(exception: )?Error: suite( thrown)?)|(suite thrown))$/ ]); expect(reporter.specDone).toHaveFailedExpectationsForRunnable('suite async spec', [ - /^(((Uncaught )?Error: spec( thrown)?)|(spec thrown))$/ + /^(((Uncaught )?(exception: )?Error: spec( thrown)?)|(spec thrown))$/ ]); done(); }); diff --git a/src/core/ExceptionFormatter.js b/src/core/ExceptionFormatter.js index 329418ab..adbf984c 100644 --- a/src/core/ExceptionFormatter.js +++ b/src/core/ExceptionFormatter.js @@ -1,11 +1,15 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) { + var ignoredProperties = ['name', 'message', 'stack', 'fileName', 'sourceURL', 'line', 'lineNumber', 'column', 'description', 'jasmineMessage']; + function ExceptionFormatter(options) { var jasmineFile = (options && options.jasmineFile) || j$.util.jasmineFile(); this.message = function(error) { var message = ''; - if (error.name && error.message) { + if (error.jasmineMessage) { + message += error.jasmineMessage; + } else if (error.name && error.message) { message += error.name + ': ' + error.message; } else if (error.message) { message += error.message; @@ -63,12 +67,11 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) { return; } - var ignored = ['name', 'message', 'stack', 'fileName', 'sourceURL', 'line', 'lineNumber', 'column', 'description']; var result = {}; var empty = true; for (var prop in error) { - if (j$.util.arrayContains(ignored, prop)) { + if (j$.util.arrayContains(ignoredProperties, prop)) { continue; } result[prop] = error[prop]; diff --git a/src/core/GlobalErrors.js b/src/core/GlobalErrors.js index 06f8daa0..56c10c82 100644 --- a/src/core/GlobalErrors.js +++ b/src/core/GlobalErrors.js @@ -14,28 +14,44 @@ getJasmineRequireObj().GlobalErrors = function(j$) { }; this.originalHandlers = {}; - this.installOne_ = function installOne_(errorType) { + this.jasmineHandlers = {}; + this.installOne_ = function installOne_(errorType, jasmineMessage) { + function taggedOnError(error) { + error.jasmineMessage = jasmineMessage + ': ' + error; + + var handler = handlers[handlers.length - 1]; + + if (handler) { + handler(error); + } else { + throw error; + } + } + this.originalHandlers[errorType] = global.process.listeners(errorType); + this.jasmineHandlers[errorType] = taggedOnError; + global.process.removeAllListeners(errorType); - global.process.on(errorType, onerror); + global.process.on(errorType, taggedOnError); this.uninstall = function uninstall() { var errorTypes = Object.keys(this.originalHandlers); for (var iType = 0; iType < errorTypes.length; iType++) { var errorType = errorTypes[iType]; - global.process.removeListener(errorType, onerror); + global.process.removeListener(errorType, this.jasmineHandlers[errorType]); for (var i = 0; i < this.originalHandlers[errorType].length; i++) { global.process.on(errorType, this.originalHandlers[errorType][i]); } delete this.originalHandlers[errorType]; + delete this.jasmineHandlers[errorType]; } }; }; this.install = function install() { if (global.process && global.process.listeners && j$.isFunction_(global.process.on)) { - this.installOne_('uncaughtException'); - this.installOne_('unhandledRejection'); + this.installOne_('uncaughtException', 'Uncaught exception'); + this.installOne_('unhandledRejection', 'Unhandled promise rejection'); } else { var originalHandler = global.onerror; global.onerror = onerror; diff --git a/src/core/QueueRunner.js b/src/core/QueueRunner.js index a926cc91..1566bcd3 100644 --- a/src/core/QueueRunner.js +++ b/src/core/QueueRunner.js @@ -78,7 +78,7 @@ getJasmineRequireObj().QueueRunner = function(j$) { cleanup(); if (j$.isError_(err)) { - if (!(err instanceof StopExecutionError)) { + if (!(err instanceof StopExecutionError) && !err.jasmineMessage) { self.fail(err); } self.errored = errored = true;