I'm writing unit tests for a component that renders a Material UI Select. But userEvent.selectOption
does not seem to be working. In the example below, both getByRole
calls seem to be selecting the correct components, but the validation with screen.getByText
fails to find the text, and the test output shows that the placeholder option is still selected. Testing manually in Storybook shows my component works as expected. I've tried some variations of using fireEvent
but no luck with that either.
TestSelect.tsx:
import { Box, Select } from '@mui/material';
import { useState } from 'react';
export function TestSelect() {
const [thing, setThing] = useState('');
return (
<Box>
<Select
placeholder="hi"
onChange={(evt) => {
setThing(evt.target.value);
}}
value={thing}
>
<option key="" value="">hi</option>
<option value="One">One</option>
<option value="Two">Two</option>
</Select>
<div>{thing && `thing: ${thing}`}</div>
</Box>
);
}
TestSelect.test.tsx:
import userEvent from '@testing-library/user-event';
import { render, screen } from '@testing-library/react';
import { TestSelect } from './TestSelect';
it('select option', async () => {
const { click, selectOptions } = userEvent.setup();
render(<TestSelect />);
await click(screen.getByRole('button'));
await selectOptions(
screen.getByRole('listbox'),
screen.getByRole('option', { name: 'One' })
);
// next line throws "Unable to find an element with the text: thing: One."
expect(screen.getByText('thing: One')).toBeInTheDocument();
});
according to the test output, here is the relevant section of the DOM at the time the assertion happens (after the selectOptions
promise has resolved):
<ul
class="MuiList-root MuiList-padding MuiMenu-list css-6hp17o-MuiList-root-MuiMenu-list"
role="listbox"
tabindex="-1"
>
<option
aria-selected="true"
data-value=""
role="option"
tabindex="0"
>
hi
</option>
<option
aria-selected="false"
data-value="One"
role="option"
>
One
</option>
<option
aria-selected="false"
data-value="Two"
role="option"
>
Two
</option>
</ul>
package versions:
"@mui/material": "5.10.5",
"@testing-library/react": "13.4.0",
"@testing-library/user-event": "14.4.3",
"vitest": "0.23.4"