-
Notifications
You must be signed in to change notification settings - Fork 252
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
"act" is necessary with Fake Timers even though (IIUC) shouldn't be #1218
Comments
A similar issue I encountered where the test was passing when it should fail. App.jsx function App() {
const [counter, setCounter] = useState(0);
return (
<button
type="button"
// The next line should make the test fail
onClick={() => setCounter(counter + 1)}
>
{counter}
</button>
);
} App.test.jsx it('should increment a counter', async () => {
const user = userEvent.setup();
render(<App />);
const button = screen.getByRole('button');
// await act(async () => {
await user.tripleClick(button);
// });
expect(button).toHaveTextContent('3');
}); If the clicks are ever called really close to each other, it is possible that useState might use stale data. Hence, I was expecting it to catch the bug on its own since it's discouraged to wrap with |
This is not a bug with user-event. For the initial post by @mitchhentgesspotify see this blog post which explains why your For the post by @pixie-cheeks, this is an issue with the event handler: // This will only increase by one no matter how often a user clicks between two updates of the DOM element:
<button onClick={() => setCounter(counter + 1))/>
// This will increase by one for each click no matter when the event handler on the DOM element is updated:
<button onClick={() => setCounter(prevCount => prevCount + 1)}/> |
Thanks for the blog link 👍 I went from:
to
|
Reproduction example
https://codesandbox.io/p/devbox/9r8lr2
Prerequisites
useState()
within asetTimeout()
in response to user inputuseState()
change (e.g. querying for an element that should now be rendered)In my linked repro, this test will fail unless the "user input" done by the test happens in an
act()
So, within the linked sandbox:
pnpm test
, the test will failMyForm.test.js
and uncomment theact(...)
call. Runningpnpm test
will now succeed.Expected behavior
The test should pass without needing to wrap the user input in
act(...)
, because according to this comment:Actual behavior
If the user input isn't wrapped in
act(...)
, then, even though theuseState()
value was updated, a re-render isn't triggered before the test continues, causing it to fail.User-event version
14.5.2
Environment
Repro'd in a sandbox even though it's a bit tricky these days 😅
Additional context
No response
The text was updated successfully, but these errors were encountered: