diff --git a/src/lib/error-handler.js b/src/lib/error-handler.js index 3f721826b..f633f995a 100644 --- a/src/lib/error-handler.js +++ b/src/lib/error-handler.js @@ -1,19 +1,18 @@ -function errorMessage (msg, info) { +function errorMessage (message, info) { if (info) { - return `${msg} : additional info ${info}` + return `${message} : additional info ${info}` } - return msg + return message } -export default function errorHandler (err, _vm, info) { - if ((typeof err === 'object') && err.message) { - if (info) { - err.message = errorMessage(err.message, info) - } +export default function errorHandler (errorOrString, vm, info) { + const error = (typeof errorOrString === 'object') + ? errorOrString + : new Error(errorOrString) - throw err - } + error.message = errorMessage(error.message, info) + vm._error = error - throw new Error(errorMessage(err, info)) + throw error } diff --git a/src/mount.js b/src/mount.js index 9a461d2b9..603fca128 100644 --- a/src/mount.js +++ b/src/mount.js @@ -25,5 +25,9 @@ export default function mount (component: Component, options: Options = {}): Vue vm.$mount() } + if (vm._error) { + throw (vm._error) + } + return new VueWrapper(vm, { attachedToDocument: !!options.attachToDocument }) } diff --git a/test/unit/specs/lib/error-handler.spec.js b/test/unit/specs/lib/error-handler.spec.js index 9e6dbdbb0..84c3c2b95 100644 --- a/test/unit/specs/lib/error-handler.spec.js +++ b/test/unit/specs/lib/error-handler.spec.js @@ -4,9 +4,8 @@ describe('errorHandler', () => { const errorString = 'errorString' const info = 'additional info provided by vue' const errorObject = new Error(errorString) - it('when error object: rethrows error', () => { - expect(() => errorHandler(errorObject)).to.throw().with.property('message', errorString) + expect(() => errorHandler(errorObject, {})).to.throw().with.property('message', errorString) }) it('when error object: rethrown error contains vue info when provided', () => { @@ -17,8 +16,15 @@ describe('errorHandler', () => { }) }) + it('when error object: sets vm_error to the error that is thrown', () => { + const vm = {} + expect(() => errorHandler(errorObject, vm, info)).to.throw().that.satisfies(function (err) { + return err === vm._error + }) + }) + it('when error string: throws error with string', () => { - expect(() => errorHandler(errorString)).to.throw().with.property('message', errorString) + expect(() => errorHandler(errorString, {})).to.throw().with.property('message', errorString) }) it('throws error with string and appends info when provided', () => { @@ -28,4 +34,12 @@ describe('errorHandler', () => { return errorMessage.includes(errorString) && errorMessage.includes(info) }) }) + + it('when error string: sets vm_error to the error that is thrown', () => { + const vm = {} + + expect(() => errorHandler(errorObject, vm, info)).to.throw().that.satisfies(function (err) { + return err === vm._error + }) + }) }) diff --git a/test/unit/specs/mount.spec.js b/test/unit/specs/mount.spec.js index a04ec004e..f6cc506cc 100644 --- a/test/unit/specs/mount.spec.js +++ b/test/unit/specs/mount.spec.js @@ -143,13 +143,14 @@ describe('mount', () => { expect(wrapper.vm.$options.listeners).to.equal(undefined) }) - it.skip('throws an error when the component fails to mount', () => { + it('propagates errors when they are thrown', () => { const TestComponent = { template: '
', mounted: function () { throw new Error('Error in mounted') } } + const fn = () => mount(TestComponent) expect(fn).to.throw() }) diff --git a/test/unit/specs/shallow.spec.js b/test/unit/specs/shallow.spec.js index c969ffe7e..066a44868 100644 --- a/test/unit/specs/shallow.spec.js +++ b/test/unit/specs/shallow.spec.js @@ -75,7 +75,7 @@ describe('shallow', () => { expect(info.called).to.equal(false) }) - it.skip('throws an error when the component fails to mount', () => { + it('throws an error when the component fails to mount', () => { expect(() => shallow({ template: '', mounted: function () {