If you wish to update the props of a rendered component in your React testing library test, then you can simply use the rerender
function like so:
import { render } from '@testing-library/react';
const { rerender } = render(<MyComponent prop="foo" />);
// re-render the same component with different props
rerender(<MyComponent prop="bar" />);
In this way, you won't be remounting the component. To demonstrate this, consider the following example:
import React, { useRef } from 'react';
import { render, screen } from '@testing-library/react';
let idCounter = 1;
const Wishlist = ({ totalItems }) => {
const id = useRef(idCounter++);
return (
<div>
<span>Total Items: {totalItems}</span>
<span data-testid="instance-id">{id.current}</span>
</div>
);
};
test('re-rendering the same component with different props does not remount', () => {
const { rerender } = render(<Wishlist totalItems={1} />);
expect(screen.getByText('Total Items: 1')).toBeInTheDocument();
rerender(<Wishlist totalItems={2} />);
expect(screen.getByText('Total Items: 2')).toBeInTheDocument();
expect(screen.getByTestId('instance-id')).toHaveTextContent('1');
});
As you can see in the example above, the "instance-id
" remains the same after re-rendering. This proves that the rendered component does not remount when using the rerender
function (i.e. a new instance of the rendered component is not created).
This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.