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