material-ui と material-icons で書いたコンポーネントを react-testing-library でテストしようとした。およそこんな形のコンポーネントだ。
import IconButton from '@material-ui/core/IconButton';
import AddIcon from '@material-ui/icons/Add';
const SomeComponent = ({ handleClick }) => {
return (
<IconButton color="primary" onClick={handleClick}>
<AddIcon />
</IconButton>
);
}
testing-library のセオリー通りにいけば alt
、 role
ないし label
を設定して適当なクエリ API を呼び出してテスト対象の要素を取得するところである。しかしどれを使って SVG アイコンのアクセシビリティを担保するか?
答えは title
タグを使うことだという。これがもっとも簡単な手段だとW3Cのレファレンスに書いてある。
Material-icon では次のように書ける。
import IconButton from '@material-ui/core/IconButton';
import AddIcon from '@material-ui/icons/Add';
const SomeComponent = ({ handleClick }) => {
return (
<IconButton color="primary" onClick={handleClick}>
- <AddIcon />
+ <AddIcon titleAccess="add-icon" />
</IconButton>
);
}
これで、 testing-library では getByTitle
の API で要素を取得してテストも可能になる。次のような形だ。
import { render, fireEvent } from '@testing-library/react';
describe('event', () => {
it('should be clickable.', () => {
const handleClick = jest.fn();
const { getByTitle } = render(<SomeComponent handleClick={handleClick} />);
const icon = getByTitle('add-icon');
fireEvent.click(icon);
expect(handleClick).toHaveBeenCalledTimes(1);
});
});