- The problem
- The solution
- Installation
- Examples
- Hooks
- Guiding Principles
- Docs
- Issues
- Contributors
- LICENSE
You want to write maintainable tests for your React components. As a part of this goal, you want your tests to avoid including implementation details of your components and rather focus on making your tests give you the confidence for which they are intended. As part of this, you want your testbase to be maintainable in the long run so refactors of your components (changes to implementation but not functionality) don't break your tests and slow you and your team down.
The React Testing Library
is a very lightweight solution for testing React
components. It provides light utility functions on top of react-dom
and
react-dom/test-utils
, in a way that encourages better testing practices. Its
primary guiding principle is:
The more your tests resemble the way your software is used, the more confidence they can give you.
This module is distributed via npm which is bundled with node and
should be installed as one of your project's devDependencies
.
Starting from RTL version 16, you'll also need to install
@testing-library/dom
:
npm install --save-dev @testing-library/react @testing-library/dom
or
for installation via yarn
yarn add --dev @testing-library/react @testing-library/dom
This library has peerDependencies
listings for react
, react-dom
and
starting from RTL version 16 also @testing-library/dom
.
React Testing Library versions 13+ require React v18. If your project uses an older version of React, be sure to install version 12:
npm install --save-dev @testing-library/react@12
yarn add --dev @testing-library/react@12
You may also be interested in installing @testing-library/jest-dom
so you can
use the custom jest matchers.
There is a known compatibility issue with React DOM 16.8 where you will see the following warning:
Warning: An update to ComponentName inside a test was not wrapped in act(...).
If you cannot upgrade to React DOM 16.9, you may suppress the warnings by adding the following snippet to your test configuration (learn more):
// this is just a little hack to silence a warning that we'll get until we
// upgrade to 16.9. See also: https://github.com/facebook/react/pull/14853
const originalError = console.error
beforeAll(() => {
console.error = (...args) => {
if (/Warning.*not wrapped in act/.test(args[0])) {
return
}
originalError.call(console, ...args)
}
})
afterAll(() => {
console.error = originalError
})
// hidden-message.js import * as React from 'react' // NOTE: React Testing Library works well with React Hooks and classes. // Your tests will be the same regardless of how you write your components. function HiddenMessage({children}) { const [showMessage, setShowMessage] = React.useState(false) return ( <div> <label htmlFor="toggle">Show Messagelabel> <input id="toggle" type="checkbox" onChange={e => setShowMessage(e.target.checked)} checked={showMessage} /> {showMessage ? children : null} div> ) } export default HiddenMessage