diff --git a/src/dom/__tests__/errorHook.test.ts b/src/dom/__tests__/errorHook.test.ts index c7f21847..5182c0ce 100644 --- a/src/dom/__tests__/errorHook.test.ts +++ b/src/dom/__tests__/errorHook.test.ts @@ -142,4 +142,42 @@ describe('error hook tests', () => { expect(result.error).toBe(undefined) }) }) + + describe('error output suppression', () => { + const originalConsoleError = console.error + const mockConsoleError = jest.fn() + + beforeEach(() => { + console.error = mockConsoleError + }) + + afterEach(() => { + console.error = originalConsoleError + }) + + test('should suppress error output', () => { + const { result } = renderHook(() => useError(true), { + suppressErrorOutput: true + }) + + expect(result.error).toEqual(Error('expected')) + expect(mockConsoleError).toBeCalledTimes(0) + }) + + test('should not suppress error output', () => { + const { result } = renderHook(() => useError(true), { + suppressErrorOutput: false + }) + + expect(result.error).toEqual(Error('expected')) + expect(mockConsoleError).toBeCalledWith( + expect.stringMatching(/^Error: Uncaught \[Error: expected\]/), + expect.any(Error) + ) + expect(mockConsoleError).toBeCalledWith( + expect.stringMatching(/^The above error occurred in the component:/) + ) + expect(mockConsoleError).toBeCalledTimes(2) + }) + }) }) diff --git a/src/dom/pure.ts b/src/dom/pure.ts index 3958dd93..8d28bc7a 100644 --- a/src/dom/pure.ts +++ b/src/dom/pure.ts @@ -8,10 +8,10 @@ import { createTestHarness } from '../helpers/createTestHarness' function createDomRenderer( rendererProps: RendererProps, - { wrapper }: RendererOptions + options: RendererOptions ) { const container = document.createElement('div') - const testHarness = createTestHarness(rendererProps, wrapper) + const testHarness = createTestHarness(rendererProps, options) return { render(props?: TProps) { diff --git a/src/helpers/createTestHarness.tsx b/src/helpers/createTestHarness.tsx index 0d1d4838..48d4b2a9 100644 --- a/src/helpers/createTestHarness.tsx +++ b/src/helpers/createTestHarness.tsx @@ -4,11 +4,11 @@ import filterConsole from 'filter-console' import { addCleanup } from '../core' -import { RendererProps, WrapperComponent } from '../types/react' +import { RendererProps, RendererOptions } from '../types/react' -function suppressErrorOutput() { +function filterErrorOutput() { // The error output from error boundaries is notoriously difficult to suppress. To save - // out users from having to work it out, we crudely suppress the output matching the patterns + // our users from having to work it out, we crudely suppress the output matching the patterns // below. For more information, see these issues: // - https://github.com/testing-library/react-hooks-testing-library/issues/50 // - https://github.com/facebook/react/issues/11098#issuecomment-412682721 @@ -28,7 +28,7 @@ function suppressErrorOutput() { function createTestHarness( { callback, setValue, setError }: RendererProps, - Wrapper?: WrapperComponent, + { wrapper: Wrapper, suppressErrorOutput = true }: RendererOptions, suspense: boolean = true ) { const TestComponent = ({ hookProps }: { hookProps?: TProps }) => { @@ -47,7 +47,9 @@ function createTestHarness( return null } - suppressErrorOutput() + if (suppressErrorOutput) { + filterErrorOutput() + } const testHarness = (props?: TProps) => { resetErrorBoundary() diff --git a/src/native/pure.ts b/src/native/pure.ts index 2ce742aa..a135ac74 100644 --- a/src/native/pure.ts +++ b/src/native/pure.ts @@ -7,10 +7,10 @@ import { createTestHarness } from '../helpers/createTestHarness' function createNativeRenderer( rendererProps: RendererProps, - { wrapper }: RendererOptions + options: RendererOptions ) { let container: ReactTestRenderer - const testHarness = createTestHarness(rendererProps, wrapper) + const testHarness = createTestHarness(rendererProps, options) return { render(props?: TProps) { diff --git a/src/server/pure.ts b/src/server/pure.ts index 3cd25a9d..f0efda2d 100644 --- a/src/server/pure.ts +++ b/src/server/pure.ts @@ -9,12 +9,12 @@ import { createTestHarness } from '../helpers/createTestHarness' function createServerRenderer( rendererProps: RendererProps, - { wrapper }: RendererOptions + options: RendererOptions ) { let renderProps: TProps | undefined let hydrated = false const container = document.createElement('div') - const testHarness = createTestHarness(rendererProps, wrapper, false) + const testHarness = createTestHarness(rendererProps, options, false) return { render(props?: TProps) { diff --git a/src/types/react.ts b/src/types/react.ts index 56e2798a..4db84394 100644 --- a/src/types/react.ts +++ b/src/types/react.ts @@ -11,6 +11,7 @@ export type WrapperComponent = ComponentType export type RendererOptions = { wrapper?: WrapperComponent + suppressErrorOutput?: boolean } export type RenderHookOptions = BaseRenderHookOptions & {