diff --git a/src/__tests__/cleanup-throw.js b/src/__tests__/cleanup-throw.js
new file mode 100644
index 00000000..6bb1a439
--- /dev/null
+++ b/src/__tests__/cleanup-throw.js
@@ -0,0 +1,21 @@
+import {render, cleanup} from '@testing-library/vue'
+import Vue from 'vue'
+
+test('cleanup re-throws errors from async lifecycle hooks', async () => {
+ const err = new Error('foo')
+ render({
+ async mounted() {
+ await new Promise((resolve, reject) => reject(err))
+ },
+ template: `
Hello World
`,
+ })
+ // thrown errors are logged redundantly by vue-test-utils injected Vue.config.errorHandler
+ // mute console
+ const spy = jest.spyOn(console, 'error').mockImplementation(() => {})
+
+ await Vue.nextTick()
+ expect(cleanup).toThrow(err)
+
+ // unmute console
+ spy.mockReset()
+})
diff --git a/src/vue-testing-library.js b/src/vue-testing-library.js
index 00df697b..5de7f5fb 100644
--- a/src/vue-testing-library.js
+++ b/src/vue-testing-library.js
@@ -97,9 +97,11 @@ function cleanupAtWrapper(wrapper) {
document.body.removeChild(wrapper.element.parentNode)
}
- wrapper.destroy()
-
- mountedWrappers.delete(wrapper)
+ try {
+ wrapper.destroy()
+ } finally {
+ mountedWrappers.delete(wrapper)
+ }
}
// Vue Testing Library's version of fireEvent will call DOM Testing Library's