@react-aria/test-utils offers common tabs 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-aria/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 Tabs tester in your test cases. This gives you access to Tabs 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 Tabs tester, use it to change tab selection, and verify the tabs' state after each interaction.
// Tabs.test.tsimport {render} from'@testing-library/react';
import {User} from'@react-aria/test-utils';
lettestUtilUser = new User({interactionType: 'mouse'});
// ...it('Tabs can change selection via keyboard', asyncfunction () {
// Render your test component/app and initialize the listbox testerlet {getByTestId} = render(
<Tabs data-testid="test-tabs">
...
</Tabs>
);
lettabsTester = testUtilUser.createTester('Tabs', {root: getByTestId('test-tabs'), interactionType: 'keyboard'});
lettabs = tabsTester.tabs;
expect(tabsTester.selectedTab).toBe(tabs[0]);
awaittabsTester.triggerTab({tab: 1});
expect(tabsTester.selectedTab).toBe(tabs[1]);
});
See below for the full definition of the User and the Tabs tester.
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
['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.
Triggers the specified tab. Defaults to using the interaction type set on the tabs tester.
Testing FAQ
In cases like this, first double check your test setup and make sure that your test is rendering your tabs in its expected state before the test util interaction call. If everything looks correct, you can always fall back to simulating interactions manually, and using the test util to query your tabs's state post interaction.
Whenever the tabs tester queries its elements or triggers a user flow, it does so against the current state of the tabs. Therefore the tabs tester can be used alongside whatever simulated user flow you add.