Testing is crucial for ensuring React apps are stable and bug-free. Popular tools like Jest and React Testing Library make testing React components simple.

Let’s look at how to write great tests for React:

render Component

Render the component into a test environment using render from React Testing Library:

1
2
3
4
5
6
7
8
import { render } from '@testing-library/react';
import Button from './Button';

test('displays button text', () => {
  const { getByText } = render(<Button>Click</Button>);
  
  expect(getByText('Click')).toBeInTheDocument(); 
});

This renders the component virtually for testing.

Fire Events

Simulate user events like clicks with fireEvent:

1
2
3
4
5
6
7
8
test('calls onClick prop on click', () => {
  const onClick = jest.fn();
  const { getByText } = render(<Button onClick={onClick}>Click</Button>);
  
  fireEvent.click(getByText('Click'));
  
  expect(onClick).toHaveBeenCalledTimes(1); 
});

Assertion Matchers

Use matchers like toBeInTheDocument to make assertions:

1
2
3
4
5
// Assertion passes
expect(getByText('Click')).toBeInTheDocument();

// Assertion fails 
expect(getByText('Click')).not.toBeInTheDocument();

Mock Functions

Spy on callbacks with mock functions:

1
2
3
4
5
const handleChange = jest.fn();

// interact with component 

expect(handleChange).toHaveBeenCalledWith('input value');

This allows asserting function calls.

Summary

  • Use render to mount components
  • Fire events to simulate interaction
  • Make assertions with matchers
  • Spy on callbacks with mock functions

Automated testing results in robust React components you can refactor with confidence.