Skip to content

Commit 4c5f724

Browse files
fix: prevent auto-cleanup to throw when asserting errors in async lifecycle hooks (#142)
* fix: delete wrappers before destroying `wrapper.destroy()` will rethrow any errors via vue test utils `throwIfInstancesThrew`. ensure that wrappers are deleted from mountedWrappers at any time * test: add tests for re-throwing async lifecycle hooks * Update src/__tests__/cleanup-throw.js Co-authored-by: Adrià Fontcuberta <[email protected]>
1 parent b54744a commit 4c5f724

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

src/__tests__/cleanup-throw.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import {render, cleanup} from '@testing-library/vue'
2+
import Vue from 'vue'
3+
4+
test('cleanup re-throws errors from async lifecycle hooks', async () => {
5+
const err = new Error('foo')
6+
render({
7+
async mounted() {
8+
await new Promise((resolve, reject) => reject(err))
9+
},
10+
template: `<h1>Hello World</h1>`,
11+
})
12+
// thrown errors are logged redundantly by vue-test-utils injected Vue.config.errorHandler
13+
// mute console
14+
const spy = jest.spyOn(console, 'error').mockImplementation(() => {})
15+
16+
await Vue.nextTick()
17+
expect(cleanup).toThrow(err)
18+
19+
// unmute console
20+
spy.mockReset()
21+
})

src/vue-testing-library.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,11 @@ function cleanupAtWrapper(wrapper) {
9797
document.body.removeChild(wrapper.element.parentNode)
9898
}
9999

100-
wrapper.destroy()
101-
102-
mountedWrappers.delete(wrapper)
100+
try {
101+
wrapper.destroy()
102+
} finally {
103+
mountedWrappers.delete(wrapper)
104+
}
103105
}
104106

105107
// Vue Testing Library's version of fireEvent will call DOM Testing Library's

0 commit comments

Comments
 (0)