userEvent.click triggers warning that it must be wrapped in act in beforeEach
See original GitHub issue@testing-library/user-event
version: 12.2.2
- Testing Framework and version: Jest 26.6.3
- DOM Environment: whatever default ships with Jest 26.6.3
Relevant code or config
beforeEach(() => {
userEvent.click(button.getByTestId('foobar'));
});
What you did: Ran the test
What happened:
Warning: An update to Foobar inside a test was not wrapped in act(...).
When testing, code that causes React state updates should be wrapped into act(...):
act(() => {
/* fire events that update state */
});
/* assert on the output */
This ensures that you're testing the behavior the user would see in the browser. Learn more at https://fb.me/react-wrap-tests-with-act
in Foobar
Reproduction repository:
Problem description: We don’t have this problem when clicking the same button inside the test itself. But in beforeEach, it flips out and demands that we wrap in act and await. Then the warning goes away.
Suggested solution: Either fix it or document it in the description for userEvent.click.
Issue Analytics
- State:
- Created 3 years ago
- Comments:16 (14 by maintainers)
Top Results From Across the Web
React Testing Library with userEvent.click wrong act() warning
I was finally able to track down a workaround. This GitHub post mentions wrapping userEvent() calls in act() which I've already done.
Read more >Kent C. Dodds on Twitter: "Tip: act(() => fireEvent...) and act ...
Some have noticed that they see an "act warning" go away when wrapping these in an async act. The warning would go away...
Read more >Fix the "not wrapped in act(...)" warning - Kent C. Dodds
When testing, code that causes React state updates should be wrapped into act(...): act(() => { /* fire events that update state ...
Read more >React Testing Library and the “not wrapped in act” Errors
click triggers fetchData to be called, which is an asynchronous call. When its response comes back, setPerson will be invoked, but at this...
Read more >useEffect – How to test React Effect Hooks - cultivate
console.error Warning: An update to Students inside a test was not wrapped in act(...). When testing, code that causes React state updates should...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
While I don’t see good reason to use
userEvent
inside ofbeforeEach
, it certainly is possible and does not require some extraact
per se: https://codesandbox.io/s/quiet-fast-clsk9?file=/src/App.test.jsI guess your test setup - if performed in specific order - covers up some delayed state change. You might want to examine what exactly makes your code run synchronously / in specific order in one case and asynchronously in the other. Maybe a mocked
window.setTimeout
?user-event@12.2
. In the latest (and currently only supported version)user-event@14
all methods are asynchronous.user-event
should not be wrapped inact
. If you get anact
warning, your code does something it either shouldn’t or that you are not aware of - like a delayed asynchronous state update.An interaction that involves moving parts of the component under test should never be before the test. A failure of this step is a failure of the component under test.
And those cases not covered by “almost” should go into a
beforeEach
. Rule of thumb: If there’s a symmetricalafterEach
/afterAll
, the code should go into abefore
hook. If there isn’t, it is a mistake most of the time.There is no need to copy&paste code. Write a
renderThisPartOfMyApp
function and invoke it in the first line of the test. The next dev who has to work with the test might thank you, because they can follow the function name to its declaration and don’t need to jump through code to findbeforeEach
hooks that might or might not be there.This recommendation is of course biased. There is no technical barrier preventing you from writing you whole test in a
beforeEach
hook. It’s just that each line in abefore
hook has the potential to obfuscate a problem or - like this issue demonstrates only too well - to make people look for problems where there is none. That’s why we recommend to avoid this.If you have further questions: Please, let’s keep this issue board tidy and use it for discussing technical details on definite issues. We’ve got a Discussions board with Q&A section and a Discord server for everything else.