Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Calling render on a component that throws, results in 4 renders #1291

Open
R-J-dev opened this issue Mar 27, 2024 · 1 comment
Open

Calling render on a component that throws, results in 4 renders #1291

R-J-dev opened this issue Mar 27, 2024 · 1 comment

Comments

@R-J-dev
Copy link

R-J-dev commented Mar 27, 2024

  • @testing-library/react version: 14.2.2
  • Testing Framework and version: jest 29.4.1
  • DOM Environment: jest-environment-jsdom 29.4.1
  • node: 20.11.1
  • react: 18.2.0

Relevant code or config:

https://github.com/R-J-dev/example-error-render-issue/blob/main/src/test-error/error-component.tsx

error-component.tsx (just as an example, I know the return is unreachable):

export const ErrorComponent = () => {
  // This logs four times, but it should log only once?
  console.log('test error in component');
  // When debugging this during a test, the debugger wil stop here five times. But we expect that it stops only once?
  throw new Error('test error in component');
  return <p>This is an error test component, which will throw an error</p>;
};

error-component.spec.tsx:

import { render } from '@testing-library/react';
import { ErrorComponent } from './error-component';

it('should throw', () => {
  expect(() => render(<ErrorComponent />)).toThrow('test error in component');
});

What you did:

I was trying to test if a specific error was thrown in a component and used the render function from @testing-library/react.

What happened:

When debugging the component that is called in the render function, I found out that it seems to load 4/5 times.
Without throwing an error in the component that is being rendered, the component only loads once.
When calling the component that throws an error without the render function, the component only loads once.

Reproduction:

Reproduction repo can be found here: https://github.com/R-J-dev/example-error-render-issue/tree/main
It's a new setup created with: npx create-nx-workspace@latest (https://nx.dev/getting-started/intro)

The test: https://github.com/R-J-dev/example-error-render-issue/blob/main/src/test-error/error-component.spec.tsx
The component: https://github.com/R-J-dev/example-error-render-issue/blob/main/src/test-error/error-component.tsx

Problem description:

Not sure if this is normal behavior, but for me it's unexpected behavior and couldn't find why this is happening.

Also:

  • Probably not good for test performance
  • Mocking things once isn't possible, when testing if an error has thrown

Suggested solution:

It looks like that the problem is in the render function from @testing-library/react, but besides from that I have no clue yet.

@MatanBobi
Copy link
Member

This is interesting, thanks for reporting.
I've verified that this indeed doesn't happen in React Test Renderer:
https://stackblitz.com/edit/rtl-template-4fhhup?file=src%2FApp.test.tsx,package.json

Having said that, I'm not sure this is related to our implementation as we're not doing something special there, just calling root.render. I'll have to look into it though I'm not sure I'll have time to do it soon.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants