Ich habe Schwierigkeiten, eine Komponente mit Spaß und Enzym zu testen. Was ich tun möchte, ist das Senden des Formulars ohne Wert im Namensfeld zu testen. Dadurch wird sichergestellt, dass die Komponente einen Fehler anzeigt. Allerdings, wenn ich den Rest betreibe ich einen Fehler in meiner Konsole bin immer:Enzym simulieren Formular einreichen, Eigenschaft 'Wert' von undefiniert nicht lesen
TypeError: Cannot read property 'value' of undefined
Ich bin ziemlich neu in Front-End-Tests und Tests im Allgemeinen. Also bin ich mir nicht ganz sicher, ob ich das Enzym für diese Art von Test richtig verwende. Ich weiß nicht, ob meine Tests falsch sind oder ob ich gerade eine Komponente geschrieben habe, die nicht leicht zu testen ist. Ich bin offen für das Ändern meiner Komponente, wenn das den Test einfacher macht?
Komponente
class InputForm extends Component {
constructor(props) {
super(props);
this.onFormSubmit = this.onFormSubmit.bind(this);
}
onFormSubmit(e) {
e.preventDefault();
// this is where the error comes from
const name = this.name.value;
this.props.submitForm(name);
}
render() {
let errorMsg = (this.props.validationError ? 'Please enter your name.' : null);
return (
<form onSubmit={(e) => this.onFormSubmit(e)}>
<input
type="text"
placeholder="Name"
ref={ref => {
this.name = ref
}}
/>
<p className="error">
{errorMsg}
</p>
<input
type="submit"
className="btn"
value="Submit"
/>
</form>
);
}
}
InputForm.propTypes = {
submitForm: React.PropTypes.func.isRequired,
};
-Test
// all other code omitted
// bear in mind I am shallow rendering the component
describe('the user does not populate the input field',() => {
it('should display an error',() => {
const form = wrapper.find('form').first();
form.simulate('submit', {
preventDefault:() => {
},
// below I am trying to set the value of the name field
target: [
{
value: '',
}
],
});
expect(
wrapper.text()
).toBe('Please enter your name.');
});
});
Ich weiß Ihren Kommentar zu schätzen, aber ich möchte den Status nicht in zwei separaten Komponenten verwalten. Die Klasse '' 'inputForm''' ist eine Kindkomponente einer viel größeren Anwendung. Die gesamte Verwaltung wird von der übergeordneten Komponente übernommen und bei Bedarf als Requisite übergeben. Mit der Zeit werde ich die Anwendung aktualisieren, um Redux für bessere Zustandsverwaltung zu verwenden. –