testing-library / react-testing-library

🐐 Simple and complete React DOM testing utilities that encourage good testing practices.

Home Page:https://testing-library.com/react

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

asyncWrapper is not executed with act support

lionskape opened this issue · comments

  • @testing-library/react version: 14.2.2
  • Testing Framework and version: jest, 29.7
  • DOM Environment: "jest-environment-jsdom": "29.7.0"

Relevant code or config:

        const {user} = setup(<ControlDate onChange={jest.fn()} />);
        const input = screen.getByRole('textbox');
        await act(async () => {
            await user.type(input, '01.10.2015');
        });
        await act(async () => {
            await user.type(input, '02.12.2012');
        });

What you did:

I'm running events using user-events pacakge - https://github.com/testing-library/user-event

What happened:

Looks like it is executed in AsyncWrapper and make a lot of noise about "non-act environment".
testing-library/user-event#1200

This may be an issue with user-event. Can you provide a reproduction witout use-event or at least the important bits inlined?

I have the same problem:

For instance:

await act(async () => await userEvent.click(screen.getByTestId('backIcon')));

gives me the same error:

console.error
    Warning: The current testing environment is not configured to support act(...)

@eps1lon sorry, I do not have reproduction without user-event

But, as I understand from user-event issues (linked in my first message) - the problem is an AsyncWrapper implementation. User event is running inside AsyncWrapper, which is "non-act" environment.

asyncWrapper: async cb => {
const previousActEnvironment = getIsReactActEnvironment()
setReactActEnvironment(false)
try {
const result = await cb()
// Drain microtask queue.
// Otherwise we'll restore the previous act() environment, before we resolve the `waitFor` call.
// The caller would have no chance to wrap the in-flight Promises in `act()`
await new Promise(resolve => {
setTimeout(() => {
resolve()
}, 0)
if (jestFakeTimersAreEnabled()) {
jest.advanceTimersByTime(0)
}
})
return result
} finally {
setReactActEnvironment(previousActEnvironment)
}
},