Beta Preview

Testing Dialog

Test utils

@react-spectrum/test-utils offers common dialog interaction utilities which you may find helpful when writing tests. To install, simply add it to your dev dependencies via your preferred package manager.

Once installed, you can access the User that @react-spectrum/test-utils provides in your test file as shown below. This user only needs to be initialized once and then can be used to generate the Dialog tester in your test cases. This gives you access to Dialog specific utilities that you can then call within your test to query for specific subcomponents or simulate common interactions. The example test case below shows how you might go about setting up the Dialog tester, use it to open and close the dialog, and verify the dialog's state after each interaction.

// Dialog.test.ts
import {render} from '@testing-library/react';
import {User} from '@react-spectrum/test-utils';

let testUtilUser = new User({interactionType: 'mouse', advanceTimer: jest.advanceTimersByTime});
// ...

it('Dialog can be opened and closed', async function () {
  // Render your test component/app and initialize the dialog tester
  let {getByTestId, getByRole} = render(
    <DialogTrigger>
      <ActionButton>Trigger</ActionButton>
      <Dialog>
        ...
      </Dialog>
    </DialogTrigger>
  );
  let button = getByRole('button');
  let dialogTester = testUtilUser.createTester('Dialog', {root: button, overlayType: 'modal'});
  await dialogTester.open();
  let dialog = dialogTester.dialog;
  expect(dialog).toBeVisible();
  await dialogTester.close();
  expect(dialog).not.toBeInTheDocument();
});

See below for the full definition of the User and the Dialog tester.

Properties

NameTypeDefault
advanceTimer['advanceTimer']Default:
A function used by the test utils to advance timers during interactions. Required for certain aria patterns (e.g. table).
interactionType['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(opts: ): void
createTester<T extends >(patternName: T, opts: <T>): <T>
Creates an aria pattern tester, inheriting the options provided to the original user.

Properties

NameType
dialogHTMLElementnull
Returns the dialog if present.
triggerHTMLElement
Returns the dialog's trigger.

Methods

constructor(opts: ): void
setInteractionType(type: ['interactionType']): void
Set the interaction type used by the dialog tester.
open(opts: ): Promise<void>
Opens the dialog. Defaults to using the interaction type set on the dialog tester.
close(): Promise<void>
Closes the dialog via the Escape key.

Testing FAQ