React Testing Library
Adrianna Valdivia
@adriannavaldivi
ABOUT ME
MOTHER
UI ENGINEER @ SALESLOFT
PREVIOUSLY WORKED AT POLAR NOTION AND MAILCHIMP
WOMEN WHO CODE ATL EVANGELIST
#1 Best Place to Work in Atlanta
2018 and 2019
What we'll go over
- What is React Testing Library
- React Testing Library vs DOM Testing Library
- Available Queries
- Steps to writing a test
- Button test example
wHAT is
REACT TESTING LIBRARY?
- Simple testing library from Kent C. Dodds
- Works with Jest
- Verifies DOM attributes or content triggering click or other events
- Replaces Enzyme
react testing library
v.s.
dom testing library
base library | top level library |
---|---|
queries | render |
firing events | cleanup |
async utilities | act |
helpers |
DTL | RTL |
---|
QUERIES
import { render } from '@testing-library/react'
const { getByLabelText } = render(<Login />)
const node = getByLabelText('username')
ByLabelText | ByPlaceholderText | ByAltText |
---|---|---|
ByTitle | ByRole | |
ByTestId | ByDisplayValue | ByText |
Basic usage:
npm install --save-dev @testing-library/react
1. Import
2. initialize props
3. use query
4. assert
Steps to testing your component
....
export const BasicComponent = ({ title }) => {
return(
<h1>{title}</h1>
)
}
import React from 'react'
import { fireEvent, render } from '@testing-library/react'
import { BasicComponent } from './BasicComponent'
const getProps = (title = "React Testing Library") => {
return {
title
}
}
describe('Basic Component', () => {
afterEach(cleanup)
it('displays the default title text', () => {
const props = getProps()
const { getByText } = render(
<BasicComponent {...props} />
)
const title = getByText(props.title)
expect(title).toBeDefined()
expect(title).toEqual("React Testing Library")
})
})
BasicComponent.js
BasicComponent.spec.js
button.js
import React from 'react'
import p from 'prop-types'
import { ButtonContainer } from './Button.styles'
export const Button = ({ text, width, disabled, onClick }) => {
return (
<ButtonContainer
data-testid="text-input-container"
disabled={disabled}
width={width}
onClick={onClick}
>
{text}
</ButtonContainer>
)
}
)
Button.propTypes = {
disabled: p.boolean,
onClick: p.func,
text: p.string.isRequired,
width: p.oneOfType([p.string, p.number]),
}
Button.defaultProps = {
width: 240,
}
button.spec.js
import React from 'react'
import { fireEvent, render } from '@testing-library/react'
import { Button } from './Button'
const getProps = ({
text = "Welcome",
width = "250px"
disabled = false,
onClick = jest.fn()
}) => {
return {
text,
width,
disabled,
onClick,
}
}
describe('Button', () => {
afterEach(cleanup)
it('renders default props', () => {
const props = getProps()
const { getByText } = render(
<Button {...props} />
)
const title = getByText(props.text)
expect(title).toBeDefined()
expect(title).toEqual("React Testing Library")
})
it('calls onClick if disabled is false', () => {
const props = getProps()
const { getByTestId } = render(
<Button {...props} />
)
const button = getByTestId("text-input-container")
fireEvent.click(button)
expect(props.OnClick).toHaveBeenCalledTimes(1)
})
it('does not call onClick if disabled is false', () => {
// what test would you write here to get to pass
})
})