Test utils
@react-spectrum/test-utils offers common combobox interaction testing utilities. Install it with your preferred package manager.
npm install @react-spectrum/test-utils --dev
Requirements
Please note that this library uses @testing-library/dom@10 and @testing-library/user-event@14. This means that you need to be on React 18+ in order for these utilities to work.
Initialize a User object at the top of your test file, and use it to create a ComboBox pattern tester in your test cases. The tester has methods that you can call within your test to query for specific subcomponents or simulate common interactions.
// Combobox.test.ts
import {render} from '@testing-library/react';
import {User} from '@react-spectrum/test-utils';
let testUtilUser = new User({
interactionType: 'mouse'
});
// ...
it('ComboBox can select an option via keyboard', async function () {
// Render your test component/app and initialize the combobox tester
let {getByTestId} = render(
<ComboBox data-testid="test-combobox">
...
</ComboBox>
);
let comboboxTester = testUtilUser.createTester('ComboBox', {root: getByTestId('test-combobox'), interactionType: 'keyboard'});
await comboboxTester.open();
expect(comboboxTester.getListbox()).toBeInTheDocument();
let options = comboboxTester.getOptions();
await comboboxTester.toggleOptionSelection({option: options[0]});
expect(comboboxTester.getCombobox().value).toBe('One');
expect(comboboxTester.getListbox()).not.toBeInTheDocument();
});
API
User
Properties
| Name | Type | Default |
|---|---|---|
advanceTimer | UserOpts['advanceTimer'] | Default: — |
| A function used by the test utils to advance timers during interactions. Required for certain aria patterns (e.g. table). | ||
interactionType | UserOpts['interactionType'] | Default: mouse
|
| The interaction type (mouse, touch, keyboard) that the test util user will use when interacting with a component. This can be overridden at the aria pattern util level if needed. | ||
Methods
constructor | ||
createTester | ||
| Creates an aria pattern tester, inheriting the options provided to the original user. | ||
ComboBoxTester
constructor | ||
setInteractionType | ||
| Set the interaction type used by the combobox tester. | ||
open | ||
| Opens the combobox dropdown. Defaults to using the interaction type set on the combobox tester. | ||
findOption | ||
| Returns an option matching the specified index or text content. | ||
toggleOptionSelection | ||
| Toggles the selection of the desired combobox option if possible. Defaults to using the interaction type set on the combobox tester. If necessary, will open the combobox dropdown beforehand. The desired option can be targeted via the option's node, the option's text, or the option's index. | ||
close | ||
| Closes the combobox dropdown. | ||
getCombobox | ||
| Returns the combobox. | ||
getTrigger | ||
| Returns the combobox trigger button. | ||
getListbox | ||
| Returns the combobox's listbox if present. | ||
getSections | ||
| Returns the combobox's sections if present. | ||
getOptions | ||
Returns the combobox's options if present. Can be filtered to a subsection of the listbox if
provided via element. | ||
getFocusedOption | ||
| Returns the currently focused option in the combobox's dropdown if any. | ||