Optional message: stringAllows you to check whether an element is disabled from the user's perspective.
Matches if the element is a form control and the disabled attribute is specified on this element or the
element is a descendant of a form element with a disabled attribute.
<button
data-testid="button"
type="submit"
disabled
>
submit
</button>
expect(getByTestId('button')).toBeDisabled()
Allows you to check whether an element is not disabled from the user's perspective.
Works like not.toBeDisabled().
Use this matcher to avoid double negation in your tests.
<button
data-testid="button"
type="submit"
>
submit
</button>
expect(getByTestId('button')).toBeEnabled()
Optional container: HTMLElement | SVGElementsince v1.9.0
Assert whether a value is a DOM element, or not. Contrary to what its name implies, this matcher only checks that you passed to it a valid DOM element.
It does not have a clear definition of what "the DOM" is. Therefore, it does not check whether that element is contained anywhere.
Check if a form element, or the entire form, is currently invalid.
An input, select, textarea, or form element is invalid if it has an aria-invalid attribute with no
value or a value of "true", or if the result of checkValidity() is false.
<input data-testid="no-aria-invalid" />
<form data-testid="invalid-form">
<input required />
</form>
expect(getByTestId('no-aria-invalid')).not.toBeInvalid()
expect(getByTestId('invalid-form')).toBeInvalid()
This allows you to check whether the given element is partially checked. It accepts an input of type checkbox and elements with a role of checkbox with a aria-checked="mixed", or input of type checkbox with indeterminate set to true
<input type="checkbox" aria-checked="mixed" data-testid="aria-checkbox-mixed" />
<input type="checkbox" checked data-testid="input-checkbox-checked" />
<input type="checkbox" data-testid="input-checkbox-unchecked" />
<div role="checkbox" aria-checked="true" data-testid="aria-checkbox-checked" />
<div
role="checkbox"
aria-checked="false"
data-testid="aria-checkbox-unchecked"
/>
<input type="checkbox" data-testid="input-checkbox-indeterminate" />
const ariaCheckboxMixed = getByTestId('aria-checkbox-mixed')
const inputCheckboxChecked = getByTestId('input-checkbox-checked')
const inputCheckboxUnchecked = getByTestId('input-checkbox-unchecked')
const ariaCheckboxChecked = getByTestId('aria-checkbox-checked')
const ariaCheckboxUnchecked = getByTestId('aria-checkbox-unchecked')
const inputCheckboxIndeterminate = getByTestId('input-checkbox-indeterminate')
expect(ariaCheckboxMixed).toBePartiallyChecked()
expect(inputCheckboxChecked).not.toBePartiallyChecked()
expect(inputCheckboxUnchecked).not.toBePartiallyChecked()
expect(ariaCheckboxChecked).not.toBePartiallyChecked()
expect(ariaCheckboxUnchecked).not.toBePartiallyChecked()
inputCheckboxIndeterminate.indeterminate = true
expect(inputCheckboxIndeterminate).toBePartiallyChecked()
This allows you to check if a form element is currently required.
An element is required if it is having a required or aria-required="true" attribute.
<input data-testid="required-input" required />
<div
data-testid="supported-role"
role="tree"
required />
expect(getByTestId('required-input')).toBeRequired()
expect(getByTestId('supported-role')).not.toBeRequired()
Allows you to check if a form element is currently required.
An input, select, textarea, or form element is invalid if it has an aria-invalid attribute with no
value or a value of "false", or if the result of checkValidity() is true.
<input data-testid="aria-invalid" aria-invalid />
<form data-testid="valid-form">
<input />
</form>
expect(getByTestId('no-aria-invalid')).not.toBeValid()
expect(getByTestId('invalid-form')).toBeInvalid()
This allows you to check if an element is currently visible to the user.
An element is visible if all the following conditions are met:
<details /> it has the open attribute<div
data-testid="zero-opacity"
style="opacity: 0"
>
Zero Opacity
</div>
<div data-testid="visible">Visible Example</div>
expect(getByTestId('zero-opacity')).not.toBeVisible()
expect(getByTestId('visible')).toBeVisible()
Allows you to assert whether an element contains another element as a descendant or not.
<span data-testid="ancestor">
<span data-testid="descendant"></span>
</span>
const ancestor = getByTestId('ancestor')
const descendant = getByTestId('descendant')
const nonExistantElement = getByTestId('does-not-exist')
expect(ancestor).toContainElement(descendant)
expect(descendant).not.toContainElement(ancestor)
expect(ancestor).not.toContainElement(nonExistantElement)
Assert whether a string representing a HTML element is contained in another element.
<span data-testid="parent"><span data-testid="child"></span></span>
expect(getByTestId('parent')).toContainHTML('<span data-testid="child"></span>')
Optional text: anyThis allows to assert that an element has the expected accessible description.
You can pass the exact string of the expected accessible description, or you can make a partial match passing a regular expression, or by using either expect.stringContaining or expect.stringMatching.
<a data-testid="link" href="/" aria-label="Home page" title="A link to start over">Start</a>
<a data-testid="extra-link" href="/about" aria-label="About page">About</a>
<img src="avatar.jpg" data-testid="avatar" alt="User profile pic" />
<img src="logo.jpg" data-testid="logo" alt="Company logo" aria-describedby="t1" />
<span id="t1" role="presentation">The logo of Our Company</span>
expect(getByTestId('link')).toHaveAccessibleDescription()
expect(getByTestId('link')).toHaveAccessibleDescription('A link to start over')
expect(getByTestId('link')).not.toHaveAccessibleDescription('Home page')
expect(getByTestId('extra-link')).not.toHaveAccessibleDescription()
expect(getByTestId('avatar')).not.toHaveAccessibleDescription()
expect(getByTestId('logo')).not.toHaveAccessibleDescription('Company logo')
expect(getByTestId('logo')).toHaveAccessibleDescription('The logo of Our Company')
Optional text: anyThis allows you to assert that an element has the expected accessible error message.
You can pass the exact string of the expected accessible error message. Alternatively, you can perform a partial match by passing a regular expression or by using either expect.stringContaining or expect.stringMatching.
<input aria-label="Has Error" aria-invalid="true" aria-errormessage="error-message" />
<div id="error-message" role="alert">This field is invalid</div>
<input aria-label="No Error Attributes" />
<input aria-label="Not Invalid" aria-invalid="false" aria-errormessage="error-message" />
// Inputs with Valid Error Messages
expect(getByRole('textbox', {name: 'Has Error'})).toHaveAccessibleErrorMessage()
expect(getByRole('textbox', {name: 'Has Error'})).toHaveAccessibleErrorMessage('This field is invalid')
expect(getByRole('textbox', {name: 'Has Error'})).toHaveAccessibleErrorMessage(/invalid/i)
expect(
getByRole('textbox', {name: 'Has Error'}),
).not.toHaveAccessibleErrorMessage('This field is absolutely correct!')
// Inputs without Valid Error Messages
expect(
getByRole('textbox', {name: 'No Error Attributes'}),
).not.toHaveAccessibleErrorMessage()
expect(
getByRole('textbox', {name: 'Not Invalid'}),
).not.toHaveAccessibleErrorMessage()
Optional text: anyThis allows to assert that an element has the expected accessible name. It is useful, for instance, to assert that form elements and buttons are properly labelled.
You can pass the exact string of the expected accessible name, or you can make a partial match passing a regular expression, or by using either expect.stringContaining or expect.stringMatching.
<img data-testid="img-alt" src="" alt="Test alt" />
<img data-testid="img-empty-alt" src="" alt="" />
<svg data-testid="svg-title"><title>Test title</title></svg>
<button data-testid="button-img-alt"><img src="" alt="Test" /></button>
<p><img data-testid="img-paragraph" src="" alt="" /> Test content</p>
<button data-testid="svg-button"><svg><title>Test</title></svg></p>
<div><svg data-testid="svg-without-title"></svg></div>
<input data-testid="input-title" title="test" />
expect(getByTestId('img-alt')).toHaveAccessibleName('Test alt')
expect(getByTestId('img-empty-alt')).not.toHaveAccessibleName()
expect(getByTestId('svg-title')).toHaveAccessibleName('Test title')
expect(getByTestId('button-img-alt')).toHaveAccessibleName()
expect(getByTestId('img-paragraph')).not.toHaveAccessibleName()
expect(getByTestId('svg-button')).toHaveAccessibleName()
expect(getByTestId('svg-without-title')).not.toHaveAccessibleName()
expect(getByTestId('input-title')).toHaveAccessibleName()
Optional value: unknownAllows you to check if a given element has an attribute or not.
You can also optionally check that the attribute has a specific expected value or partial match using expect.stringContaining or expect.stringMatching.
<button
data-testid="ok-button"
type="submit"
disabled
>
ok
</button>
expect(button).toHaveAttribute('disabled')
expect(button).toHaveAttribute('type', 'submit')
expect(button).not.toHaveAttribute('type', 'button')
Rest ...classNames: (string | RegExp)[]Check whether the given element has certain classes within its class attribute.
You must provide at least one class, unless you are asserting that an element does not have any classes.
<button
data-testid="delete-button"
class="btn xs btn-danger"
>
delete item
</button>
<div data-testid="no-classes">no classes</div>
const deleteButton = getByTestId('delete-button')
const noClasses = getByTestId('no-classes')
expect(deleteButton).toHaveClass('btn')
expect(deleteButton).toHaveClass('btn-danger xs')
expect(deleteButton).toHaveClass(/danger/, 'xs')
expect(deleteButton).toHaveClass('btn xs btn-danger', {exact: true})
expect(deleteButton).not.toHaveClass('btn xs btn-danger', {exact: true})
expect(noClasses).not.toHaveClass()
Optional options: { Optional text: anysince v5.14.1
Check the accessible description for an element. This allows you to check whether the given element has a description or not.
An element gets its description via the
aria-describedby attribute.
Set this to the id of one or more other elements. These elements may be nested
inside, be outside, or a sibling of the passed in element.
Whitespace is normalized. Using multiple ids will join the referenced elements’ text content separated by a space.
When a string argument is passed through, it will perform a whole
case-sensitive match to the description text.
To perform a case-insensitive match, you can use a RegExp with the /i
modifier.
To perform a partial match, you can pass a RegExp or use
expect.stringContaining("partial string").
<button aria-label="Close" aria-describedby="description-close">
X
</button>
<div id="description-close">
Closing will discard any changes
</div>
<button>Delete</button>
const closeButton = getByRole('button', {name: 'Close'})
expect(closeButton).toHaveDescription('Closing will discard any changes')
expect(closeButton).toHaveDescription(/will discard/) // to partially match
expect(closeButton).toHaveDescription(expect.stringContaining('will discard')) // to partially match
expect(closeButton).toHaveDescription(/^closing/i) // to use case-insensitive match
expect(closeButton).not.toHaveDescription('Other description')
const deleteButton = getByRole('button', {name: 'Delete'})
expect(deleteButton).not.toHaveDescription()
expect(deleteButton).toHaveDescription('') // Missing or empty description always becomes a blank string
This allows you to check whether the given form element has the specified displayed value (the one the end user will see). It accepts ,
<label for="input-example">First name</label>
<input type="text" id="input-example" value="Luca" />
<label for="textarea-example">Description</label>
<textarea id="textarea-example">An example description here.</textarea>
<label for="single-select-example">Fruit</label>
<select id="single-select-example">
<option value="">Select a fruit...</option>
<option value="banana">Banana</option>
<option value="ananas">Ananas</option>
<option value="avocado">Avocado</option>
</select>
<label for="mutiple-select-example">Fruits</label>
<select id="multiple-select-example" multiple>
<option value="">Select a fruit...</option>
<option value="banana" selected>Banana</option>
<option value="ananas">Ananas</option>
<option value="avocado" selected>Avocado</option>
</select>
const input = screen.getByLabelText('First name')
const textarea = screen.getByLabelText('Description')
const selectSingle = screen.getByLabelText('Fruit')
const selectMultiple = screen.getByLabelText('Fruits')
expect(input).toHaveDisplayValue('Luca')
expect(textarea).toHaveDisplayValue('An example description here.')
expect(selectSingle).toHaveDisplayValue('Select a fruit...')
expect(selectMultiple).toHaveDisplayValue(['Banana', 'Avocado'])
Optional text: anysince v5.17.0
Check whether the given element has an ARIA error message or not.
Use the aria-errormessage attribute to reference another element that contains
custom error message text. Multiple ids is NOT allowed. Authors MUST use
aria-invalid in conjunction with aria-errormessage. Learn more from the
aria-errormessage spec.
Whitespace is normalized.
When a string argument is passed through, it will perform a whole
case-sensitive match to the error message text.
To perform a case-insensitive match, you can use a RegExp with the /i
modifier.
To perform a partial match, you can pass a RegExp or use
expect.stringContaining("partial string")`.
<label for="startTime"> Please enter a start time for the meeting: </label>
<input id="startTime" type="text" aria-errormessage="msgID" aria-invalid="true" value="11:30 PM" />
<span id="msgID" aria-live="assertive" style="visibility:visible">
Invalid time: the time must be between 9:00 AM and 5:00 PM"
</span>
const timeInput = getByLabel('startTime')
expect(timeInput).toHaveErrorMessage(
'Invalid time: the time must be between 9:00 AM and 5:00 PM',
)
expect(timeInput).toHaveErrorMessage(/invalid time/i) // to partially match
expect(timeInput).toHaveErrorMessage(expect.stringContaining('Invalid time')) // to partially match
expect(timeInput).not.toHaveErrorMessage('Pikachu!')
Check if a form or fieldset contains form controls for each given name, and having the specified value.
Can only be invoked on a form or fieldset element.
<form data-testid="login-form">
<input type="text" name="username" value="jane.doe" />
<input type="password" name="password" value="123" />
<input type="checkbox" name="rememberMe" checked />
<button type="submit">Sign in</button>
</form>
expect(getByTestId('login-form')).toHaveFormValues({
username: 'jane.doe',
rememberMe: true,
})
Check if an element has specific css properties with specific values applied.
Only matches if the element has all the expected properties applied, not just some of them.
<button
data-testid="submit-button"
style="background-color: green; display: none"
>
submit
</button>
const button = getByTestId('submit-button')
expect(button).toHaveStyle('background-color: green')
expect(button).toHaveStyle({
'background-color': 'green',
display: 'none'
})
Optional options: { Check whether the given element has a text content or not.
When a string argument is passed through, it will perform a partial case-sensitive match to the element content.
To perform a case-insensitive match, you can use a RegExp with the /i modifier.
If you want to match the whole content, you can use a RegExp to do it.
<span data-testid="text-content">Text Content</span>
const element = getByTestId('text-content')
expect(element).toHaveTextContent('Content')
// to match the whole content
expect(element).toHaveTextContent(/^Text Content$/)
// to use case-insentive match
expect(element).toHaveTextContent(/content$/i)
expect(element).not.toHaveTextContent('content')
Optional value: null | string | number | string[]Check whether the given form element has the specified value.
Accepts <input>, <select>, and <textarea> elements with the exception of <input type="checkbox"> and
<input type="radiobox">, which can be matched only using
toBeChecked or
toHaveFormValues.
<input
type="number"
value="5"
data-testid="input-number" />
const numberInput = getByTestId('input-number')
expect(numberInput).toHaveValue(5)
Optional snapshot: stringOptional message: stringOptional message: stringGenerated using TypeDoc
Description
Assert whether the given element is checked.
It accepts an
inputof typecheckboxorradioand elements with aroleofradiowith a validaria-checkedattribute of "true" or "false".Example
See
testing-library/jest-dom#tobechecked