-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
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
[v2] testing form with validationSchema #1543
Comments
I'd like to add this also happens with
|
And I forgot to mention that, even surrounding
|
I'm seeing the same issue when using a validation schema.
|
I am having the same issue when trying to change an input value: Obviously, wrapping this in |
Have you tried this?
|
@2Steaks Thanks for that snippet. Works for me. Looks like in https://github.com/jaredpalmer/formik/blob/master/packages/formik/src/Formik.tsx#L534-L553 const setValues = useEventCallback((values: Values) => {
dispatch({ type: 'SET_VALUES', payload: values });
return validateOnChange
? validateFormWithLowPriority(state.values)
: Promise.resolve(); |
Including this information in the documentation would be very helpful. Edit: Wouldn't using |
Running into this while attempting to upgrade from v1 to v2, and having it cause warnings in hundreds of tests. I'd like to avoid having to wrap all of these with async act calls if I can help it... Did anyone find any other workaround? Using @testing-library/react and @testing-library/user-event fwiw. |
@pleunv I use the same libraries, and I have written my test like this. I hope this will help. const onSubmit = jest.fn();
render(<Form onSubmit={onSubmit} />);
// without act()
userEvent.click(screen.getByRole('button', { name: 'foo' });
await waitFor(() => expect(onSubmit).toHaveBeenCalledWith({ /** XXX */ })); |
Did anyone was able to fix it using Enzyme? |
After numerous attempts this is what worked for me: import { render, fireEvent, waitFor } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
test('validates the email field', async () => {
const { getByText, getByPlaceholderText } = render(<Form />)
const emailInput = getByPlaceholderText('Email')
userEvent.type(emailInput, 'invalidemail.com')
fireEvent.blur(emailInput)
await waitFor(() => {
expect(getByText(/Please enter a valid email/i)).toBeInTheDocument()
})
})
Edit: you can also use |
I wanted to add to this for anyone that is still struggling. I had a let wrapper: RenderResult
beforeEach(() => {
wrapper = renderWithProviders(<ManualAddressForm {...props} />)
}) |
@burrack No solutions for enzyme at the moment I don't think. This breaks testing for us so hope it's fixed soon. |
This issue was fixed for me by updating formik and testing library packages to the latest versions.
|
* feat: add password confirmation on create screen * fix: labels and feedback in create form according to figma * test: verify password confirm validation message * fix: remove unnecessary escape character * fix: do not escape '-' * refactor: comments and better name for escape function * deps: add Formik form validation library * refactor: use Formik for CreateWallet form validation * refactor: remove 'isCreating' flag in favor of 'onFinished' callback * test: adapt tests to be compatible with Formik see jaredpalmer/formik#1543
Doesn't work with more up to date versions for me:
|
I think this solution deserves a bit more explanation. Normally we don't need to wrap In this case we need to wrap 2 things in fireEvent.change(getByLabelText(/email/i), { target: { value: fakeUsername } });
await act(() => Promise.resolve()); // Flush microtasks used by Formik validation As alternative if you are using delays/timers: // Flush timers and microtasks used by Formik validation
await act(() => jest.runAllTimersAsync()); |
Any news or update regarding this error? We are having the same problem using it('should submit the form with entered values', async () => {
const alertMock = jest.spyOn(window, 'alert').mockImplementation(() => {})
render(<SignInForm />)
const usernameInput = screen.getByLabelText(/username/i)
const passwordInput = screen.getByLabelText(/password/i)
const submitButton = screen.getByRole('button', { name: /signin/ })
fireEvent.change(usernameInput, { target: { value: 'testuser' } })
fireEvent.change(passwordInput, { target: { value: 'password123' } }
fireEvent.submit(submitButton)
expect(alertMock).toHaveBeenCalledWith(
JSON.stringify(
{
username: 'testuser',
password: 'password123',
branch: 1,
},
null,
2,
),
)
alertMock.mockRestore()
}) For now we have used the following solution from @romulof:
|
Formik is essentially unmaintained. Migrate to react-hook-forms. |
@tyteen4a03 Where does it say you have to migrate? Is there any collaborator, contributor or maintainer who indicates this? |
Nothing, but the huge amount of unresolved issues, unmerged PRs and the frequency of release within the past 12 months are strong indicators. |
🐛 Bug report
Current Behavior
I have a test that basically screenshots a form after removing focus from field that is required (while not filling in any value). For validations, I'm using Yup.
During
fireEvent.blur(textField);
, I get warning:I'm also trying to screenshot page after blur, expecting to see validation message. From my experiments, I need to do:
await waitForDomChange({ input })
to get correct screenshot.I've also noticed there's no warning if I don't have
validationSchema
.I assume this is connected to #1524 ?
Expected behavior
No warning.
No need for
waitForDomChange
.Reproducible example
https://codesandbox.io/s/agitated-lalande-5nhh0
Your environment
The text was updated successfully, but these errors were encountered: