Back to React Spectrum

Testing ComboBox

packages/dev/s2-docs/pages/s2/ComboBox/testing.mdx

2022-12-162.5 KB
Original Source

import {Layout} from '../../../src/Layout'; export default Layout;

import {InlineAlert, Heading, Content} from '@react-spectrum/s2'; import testUtilDocs from 'docs:@react-spectrum/test-utils'; import {InstallCommand} from '../../../src/InstallCommand'; import {PatternTestingFAQ} from '../../../src/PatternTestingFAQ';

export const isSubpage = true; export const hideFromSearch = true; export const tags = ['testing', 'combobox', 'test-utils']; export const description = 'Testing ComboBox with React Spectrum test utils';

Testing ComboBox

Test utils

@react-spectrum/test-utils offers common combobox interaction testing utilities. Install it with your preferred package manager.

<InstallCommand pkg="@react-spectrum/test-utils" flags="--dev" /> <InlineAlert variant="notice"> <Heading>Requirements</Heading> <Content>Please note that this library uses [@testing-library/react@16](https://www.npmjs.com/package/@testing-library/react) and [@testing-library/user-event@14](https://www.npmjs.com/package/@testing-library/user-event). This means that you need to be on React 18+ in order for these utilities to work.</Content> </InlineAlert>

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.

ts
// 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.listbox).toBeInTheDocument();

  let options = comboboxTester.options();
  await comboboxTester.selectOption({option: options[0]});
  expect(comboboxTester.combobox.value).toBe('One');
  expect(comboboxTester.listbox).not.toBeInTheDocument();
});

API

User

<ClassAPI links={testUtilDocs.links} class={testUtilDocs.exports.User} />

ComboBoxTester

<ClassAPI links={testUtilDocs.links} class={testUtilDocs.exports.ComboBoxTester} />

Testing FAQ

<PatternTestingFAQ patternName="combobox" />