Skip to content

Commit ade28d5

Browse files
Austioeddyerburgh
authored andcommitted
fix: set errorr on vm before we rethrow it in error handler
1 parent 0a46a2f commit ade28d5

File tree

5 files changed

+34
-16
lines changed

5 files changed

+34
-16
lines changed

src/lib/error-handler.js

+10-11
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
1-
function errorMessage (msg, info) {
1+
function errorMessage (message, info) {
22
if (info) {
3-
return `${msg} : additional info ${info}`
3+
return `${message} : additional info ${info}`
44
}
55

6-
return msg
6+
return message
77
}
88

9-
export default function errorHandler (err, _vm, info) {
10-
if ((typeof err === 'object') && err.message) {
11-
if (info) {
12-
err.message = errorMessage(err.message, info)
13-
}
9+
export default function errorHandler (errorOrString, vm, info) {
10+
const error = (typeof errorOrString === 'object')
11+
? errorOrString
12+
: new Error(errorOrString)
1413

15-
throw err
16-
}
14+
error.message = errorMessage(error.message, info)
15+
vm._error = error
1716

18-
throw new Error(errorMessage(err, info))
17+
throw error
1918
}

src/mount.js

+4
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,9 @@ export default function mount (component: Component, options: Options = {}): Vue
2525
vm.$mount()
2626
}
2727

28+
if (vm._error) {
29+
throw (vm._error)
30+
}
31+
2832
return new VueWrapper(vm, { attachedToDocument: !!options.attachToDocument })
2933
}

test/unit/specs/lib/error-handler.spec.js

+17-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ describe('errorHandler', () => {
44
const errorString = 'errorString'
55
const info = 'additional info provided by vue'
66
const errorObject = new Error(errorString)
7-
87
it('when error object: rethrows error', () => {
9-
expect(() => errorHandler(errorObject)).to.throw().with.property('message', errorString)
8+
expect(() => errorHandler(errorObject, {})).to.throw().with.property('message', errorString)
109
})
1110

1211
it('when error object: rethrown error contains vue info when provided', () => {
@@ -17,8 +16,15 @@ describe('errorHandler', () => {
1716
})
1817
})
1918

19+
it('when error object: sets vm_error to the error that is thrown', () => {
20+
const vm = {}
21+
expect(() => errorHandler(errorObject, vm, info)).to.throw().that.satisfies(function (err) {
22+
return err === vm._error
23+
})
24+
})
25+
2026
it('when error string: throws error with string', () => {
21-
expect(() => errorHandler(errorString)).to.throw().with.property('message', errorString)
27+
expect(() => errorHandler(errorString, {})).to.throw().with.property('message', errorString)
2228
})
2329

2430
it('throws error with string and appends info when provided', () => {
@@ -28,4 +34,12 @@ describe('errorHandler', () => {
2834
return errorMessage.includes(errorString) && errorMessage.includes(info)
2935
})
3036
})
37+
38+
it('when error string: sets vm_error to the error that is thrown', () => {
39+
const vm = {}
40+
41+
expect(() => errorHandler(errorObject, vm, info)).to.throw().that.satisfies(function (err) {
42+
return err === vm._error
43+
})
44+
})
3145
})

test/unit/specs/mount.spec.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,14 @@ describe('mount', () => {
143143
expect(wrapper.vm.$options.listeners).to.equal(undefined)
144144
})
145145

146-
it.skip('throws an error when the component fails to mount', () => {
146+
it('propagates errors when they are thrown', () => {
147147
const TestComponent = {
148148
template: '<div></div>',
149149
mounted: function () {
150150
throw new Error('Error in mounted')
151151
}
152152
}
153+
153154
const fn = () => mount(TestComponent)
154155
expect(fn).to.throw()
155156
})

test/unit/specs/shallow.spec.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ describe('shallow', () => {
7575
expect(info.called).to.equal(false)
7676
})
7777

78-
it.skip('throws an error when the component fails to mount', () => {
78+
it('throws an error when the component fails to mount', () => {
7979
expect(() => shallow({
8080
template: '<div></div>',
8181
mounted: function () {

0 commit comments

Comments
 (0)