From e49b03b8feb38b26c551ddc7fc9a0ed4cc8a0045 Mon Sep 17 00:00:00 2001 From: Marc Gibbons <1726961+marcgibbons@users.noreply.github.com> Date: Wed, 6 Jan 2021 09:03:22 -0500 Subject: [PATCH] fix(error.js): do not console.error handled exceptions When an exception is handled in an `errorHandler` function, do not re-raise it. fix #1760 --- packages/test-utils/src/error.js | 5 ++- test/specs/create-local-vue.spec.js | 60 +++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/packages/test-utils/src/error.js b/packages/test-utils/src/error.js index dc2ba1a53..c6da3b723 100644 --- a/packages/test-utils/src/error.js +++ b/packages/test-utils/src/error.js @@ -22,13 +22,14 @@ function errorHandler(errorOrString, vm, info) { vm._error = error } + if (!instancedErrorHandlers.length) { + throw error + } // should be one error handler, as only once can be registered with local vue // regardless, if more exist (for whatever reason), invoke the other user defined error handlers instancedErrorHandlers.forEach(instancedErrorHandler => { instancedErrorHandler(error, vm, info) }) - - throw error } export function throwIfInstancesThrew(vm) { diff --git a/test/specs/create-local-vue.spec.js b/test/specs/create-local-vue.spec.js index 6164f3a66..72bfd57b1 100644 --- a/test/specs/create-local-vue.spec.js +++ b/test/specs/create-local-vue.spec.js @@ -151,6 +151,66 @@ describeWithShallowAndMount('createLocalVue', mountingMethod => { } ) + itSkipIf( + vueVersion < 2.6, + 'Exception suppresed in `errorHandler` is not logged to console.error', + async () => { + const component = Vue.component('TestComponent', { + template: '', + methods: { + clickHandler() { + throw new Error('Should not be logged') + } + } + }) + const errorHandler = jest.fn() + const localVue = createLocalVue({ + errorHandler + }) + const wrapper = mountingMethod(component, { localVue }) + await wrapper.vm.$nextTick() + + const { error } = global.console + const spy = jest.spyOn(global.console, 'error') + await wrapper.trigger('click') + global.console.error = error + expect(spy).not.toHaveBeenCalled() + } + ) + + itSkipIf( + vueVersion < 2.6, + 'Exception raised in `errorHandler` bubbles up', + async () => { + const component = Vue.component('TestComponent', { + template: '', + methods: { + clickHandler() { + throw new Error() + } + } + }) + const errorHandler = (err, vm, info) => { + if (err) { + throw new Error('An error that should log') + } + } + const localVue = createLocalVue({ + errorHandler + }) + const wrapper = mountingMethod(component, { localVue }) + await wrapper.vm.$nextTick() + + const { error } = global.console + const spy = jest.spyOn(global.console, 'error') + await wrapper.trigger('click') + global.console.error = error + expect(spy).toHaveBeenCalledWith( + '[Vue warn]: Error in config.errorHandler: "Error: An error that should log"' + ) + } + ) + itSkipIf( process.env.TEST_ENV === 'browser' || vueVersion < 2.6, 'Calls `errorHandler` when an error is thrown asynchronously',