Reactのテストでa test was not wrapped in act(...)が出た

const user = userEvent.setup();
render(<Component />);

const link = screen.getByRole("link");
await user.click(link)
expect(...)

のようなコードを書いていたらタイトルのようなWarningが出た。 割とよくあることなのか解決方法も同時に出てstateを更新するイベントを発火するやつはactで囲めと書いてある。

ただ、単にactで囲んでact(async() => await user.click(link))でいけるかと思いきや解決しなかった。

react-act-examples/sync.md at master · threepointone/react-act-examples · GitHub

を見ると、actがPromiseを返すのでこれをawaitで待ってやれば良さそうだった。 つまり、

const user = userEvent.setup();
render(<Component />);

const link = screen.getByRole("link");
await act(() => user.click(link))
expect(...)

こう書くとWarningが出ずにテストが通った。

うまくいかないときにError: Not implemented: navigation (except hash changes)というエラーが出たりもして困っていたがこれも上記で同時に解決した。