Ich habe eine SignUp-React-Komponente, die Redux-Form verwendet und mein onSubmit sendet im Grunde eine asynchrone Aktion. Ich versuche, meine Komponente mit Enzyme und Jest zu testen, indem ich einen Spion zu meinem Dispatch hinzufüge und überprüfe, ob der Dispatch bei der Simulation einer Formularübergabe aufgerufen wird. Mein Test schlägt jedoch fehl.Enzymtest für Reduxform schlägt fehl beim Testen der Formularübergabe
Hier ist meine SignUp redux Form Komponente:
import React from 'react';
import {reduxForm, Field, focus} from 'redux-form';
import Input from './input';
import {required, nonEmpty, email, isTrimmed, length} from '../validators';
import {registerUser} from '../actions/users';
import {login} from '../actions/auth';
export class SignUpForm extends React.Component {
onSubmit(values) {
const {username, password, fname, lname} = values;
const newUser = {
username,
password,
user: {
firstName: fname,
lastName: lname
}
};
return this.props
.dispatch(registerUser(newUser))
.then(() => this.props.dispatch(login(username, password)));
}
render() {
let errorMessage;
if (this.props.error) {
errorMessage = (
<div className="message message-error">{this.props.error </div>
);
}
return (
<form className='signup-form' onSubmit={this.props.handleSubmit(values =>
this.onSubmit(values)
)}>
{errorMessage}
<Field
name="fname"
type="text"
component={Input}
label="First Name"
validate={[required, nonEmpty]}
/>
<Field
name="lname"
type="text"
component={Input}
label="Last Name"
validate={[required, nonEmpty]}
/>
<Field
name="username"
type="email"
component={Input}
label="Email"
validate={[required, nonEmpty, email, isTrimmed]}
/>
<Field
name="password"
type="password"
component={Input}
label="Password"
validate={[required, nonEmpty, length({min: 10, max: 72})]}
/>
<button
type="submit"
disabled={this.props.pristine || this.props.submitting}>
Sign Up
</button>
</form>
);
}
}
export default reduxForm({
form: 'signup',
onSubmitFail: (errors, dispatch) =>
dispatch(focus('signup', Object.keys(errors)[0]))
})(SignUpForm);
Hier ist mein Test:
import React from 'react';
import {shallow, mount} from 'enzyme';
import SignUpForm from './signup';
import {registerUser} from '../actions/users';
import { reducer as formReducer } from 'redux-form'
import { createStore, combineReducers, applyMiddleware } from 'redux'
import { Provider } from 'react-redux'
import thunk from 'redux-thunk';
import {stockReducer} from '../reducers';
describe('<SignUpForm />',() => {
let store
let wrapper
let dispatch
beforeEach(() => {
store = createStore(combineReducers({ form: formReducer, stock: stockReducer }),applyMiddleware(thunk))
dispatch = jest.fn()
wrapper = mount(
<Provider store={store}>
<SignUpForm dispatch={dispatch}/>
</Provider>
);
})
it('should fire onSubmit callback when form is submitted', (done) => {
const form = wrapper.find('form');
form.find('#fname').simulate('change', {target: {value: 'fname'}});
form.find('#lname').simulate('change', {target: {value: 'lname'}});
form.find('#username').simulate('change', {target: {value: '[email protected]'}});
form.find('#password').simulate('change', {target: {value: 'password1234'}});
form.simulate('submit');
expect(dispatch).toHaveBeenCalled();
});
});
Mein Test mit dem folgenden Fehler fehl: erwarten (jest.fn()) toHaveBeenCalled.() Erwartete Scheinfunktion wurde aufgerufen.
Bitte helfen Sie mir zu verstehen, was schief läuft.
nicht sicher, wie reduxForm funktioniert, aber vielleicht sollten Sie den Versand von reduxForm auf die eigentliche Komponente SignUpForm übergeben? nur eine Idee –