-
-
Notifications
You must be signed in to change notification settings - Fork 2k
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
simulated click on submit button in form does not submit form #308
Comments
@codekirei Yeah, I'm having the same issue. Is this behaviour expected? |
Especially concerned, that this is mount and should, by design, simulate real DOM behaviour. Or maybe DOM simulation through |
https://github.com/airbnb/enzyme/blob/master/docs/future.md "Event propagation is not supported". I assume that's what causes this problem. |
I agree with @colinramsay. If any of you guys want to put up a PR to integrate Event Propagation, i'm sure the maintainers would greatly appreciate it. |
This is pretty rough. So if I'm getting this straight there is currently no way to test code which looks like this? const LoginComponent = ({login}) => (
<form
onSubmit={e => {
const username = e.target.children[0].value;
const password = e.target.children[1].value;
login(username, password);
}}
>
<input type="text" placeholder="Username" />
<input type="text" placeholder="Password" />
<button type="submit">Sign In</button>
</form>
); |
@BLamy there are tons of ways to test it:
What further testing is needed? In no way should you be trying to write tests that test React's "onSubmit" functionality, or of browsers' submit behavior - that's the job of the React team, or the browser implementors, respectively. |
@ljharb I was talking about no way of testing it using If you So yeah I can stub |
@BLamy does |
Best I could do: const form = component.find('form').at(0),
const children = form.render().children().children();
form.simulate('submit', { target: { children } }); Which works but leaves this in the console
I'm using tape for my test |
For me the solution was to get the DOM element and trigger the click without using simulate. import { mount, shallow } from 'enzyme';
import Button from '../button/button.js';
import Field from './field.js';
import Form from './form.js';
import React from 'react';
import { spy } from 'sinon';
describe('Form', () => {
it('submit event when click submit', () => {
const callback = spy();
const wrapper = mount(
<Form onSubmit={ callback }>
<Field id="firstName" name="firstName" />
<Field id="lastName" name="lastName" />
<Field id="email" name="email" type="email" />
<footer>
<Button caption="Send" display="primary" type="submit" />
<Button caption="Clear" type="reset" />
</footer>
</Form>
);
wrapper.find('[type="submit"]').get(0).click();
expect(callback).to.have.been.called();
});
}); |
@fernandopasik "wrapper.find(...).get(...).click is not a function" |
@ZephD you can't call .get() with shallow rendering. |
Better would be |
The form submits if you use the submit event on the button.
|
@netrocc's solution seems to work, however I'm not sure why buttons are able to receive |
Hey guys, I was able to get around this by doing: component.find('form')
.simulate('submit', { preventDefault () {} }); Looks hacky, but works. |
I used @sohailykhan94's solution to test if a form submittal was properly executing a handler function. Here's what it looks like, and it seems to work well with my Jest/Enzyme testing environment.
Here is my example Form React Component. Of course this component is going to have more features, but I wanted to test if this worked, before building out the rest of it.
|
@vmasto Potentially it's because submit events bubble. |
Enzyme v3 with react 16 adapter also throws this. |
@mrchief did you find a solution for this? |
@Schachte I think I used these instead:
|
Instead of simulating the
|
@cppbit I don't think this is a solution, because this enzyme approach doesn't honor the In my situation, I have a React component that is a wrapper for an HTML |
@majew7 from what you are describing it doesn’t sound like your scenario is the same as the one in the topic of this thread which I was contributing towards. In this scenario it’s a form with an onSubmit and the corresponding static submit button type which is predictable. Perhaps share your code snippet and we can help you out with your specific scenario where the button has a dynamic type within your wrapper component. The event simulation is a signal sent to a component, if the component is not expecting the event then it won’t work. |
This is sadly working as intended. I'm going to close this with a recommendation to avoid |
hello, well I was struggling with simulate('submit') for one full day. It was working, i.e. it was raising the submit event but I always got a "TypeError: handler.apply is not a function."
|
@onurarpapay it shouldn't work; the event name is "submit", not "onsubmit". Can you file a new issue about that one? |
Can somebody post a full working example please. I have tried all the suggested solutions above using mount with a simple type submit button inside a form with onSubmit and it does not work still. |
Also, is this possible to do by simulating a keypress of enter on the submit button? |
@MartinDawson no, it’s not - and your test should be testing that the onSubmit prop does what you expect. Your test should not be verifying that the browser, or react itself, works properly - that’s a job for those projects’ tests. |
@ljharb I understand that but I was trying to do behavior driven development so I thought it would have been better to try and do it as close as possible to browser. |
In that case, you'd want something like nightwatch/selenium or puppeteer/cypress, not a unit testing tool like enzyme. |
@ajc24 I like how your post started but then, you end up testing the browser, not your unit. We all know that a submit button inside a form will fire the submit event and it's the browser's job to test that part. You should rather be testing that the submit handler does what it's supposed to and if you can ensure that, then you can leave testing the browser out of your unit tests and still be ok. Am I missing something? |
Working Solution - React Enzyme jest component Test sharing an online working good short example. In this example i have created a Checkbox and attached an event Handler, Hope this helps someone. ❇️ |
@Peripona Thanks for posting the sandbox, it's going to make it easy for people to try out different solutions. (I also love your handle "Peri-Pona" :)) I've since moved away from relying on This is not a silver bullet and whether it's the right approach or not depends on one's use case; e.g. one might argue that reaching out to I'm not sure if there is an absolute right or wrong in this case or even one way is more right than the other - just that we have options for those who get to this issue searching for answers. I hope @ljharb can chime on whether relying on |
@mrchief it's totally fine for your tests for a given component, to rely on that component's instance (and it having one). In general, I'd suggest never using |
My solve is this: So, I am testing for that directly:
|
If you have disabled property on button you will submit the form no mater if it is disabled or not. |
This comment has been minimized.
This comment has been minimized.
Thank you very much!!! |
Found solution for me: Switched onFinish form callback to onClick callback on submit button: onClick={() => form.validateFields().then(<onFinishCallback>, ()=>{})} In test: it('', async() => {
...
// without await not working, you can switch it to await new Promise((res) => setTimeout(res, 50)); after act also wotk
await act(async () => {
<submitButton>.simulate("click");
});
}); |
Say I have a simple form to test:
If I
mount
this component withenzyme
, I can confirmonSubmit
is called by simulating asubmit
event on theform
element. However, if I simulate aclick
on the submit button, the form is not submitted andonSubmit
is not called.form.simulate('submit')
calls onSubmitbutton.simulate('click')
does not call onSubmitIs this working as intended? Seems inconsistent, but I could definitely be missing something.
Example repo here. In particular, compare the test cases.
The text was updated successfully, but these errors were encountered: