Étant donné un composant simple:
export default class SearchForm extends Component {
constructor(props) {
super(props)
this.state = { query: '' }
}
onSubmit = (event) => {
event.preventDefault()
history.Push(`/results/${this.state.query}`, { query: this.state.query })
}
render() {
return (
<form onSubmit={this.onSubmit}>
<input
type="text"
value={this.state.query}
onChange={event => this.setState({ query: event.target.value })}
/>
<button>Search</button>
</form>
)
}
}
Et le test:
describe('SearchForm Component', () => {
it('should navigate to results/query when submitted', () => {
const wrapper = shallow(<SearchForm />)
...?
})
})
Comment vérifiez-vous que la soumission du formulaire amène l'utilisateur à la page suivante avec la valeur de requête correcte?
J'ai essayé de simplement me moquer du gestionnaire onSubmit et au moins de confirmer qu'il a été appelé, mais cela entraîne une erreur de sécurité due à history.Push
.
const wrapper = shallow(<SearchForm />)
const mockedEvent = { target: {}, preventDefault: () => {} }
const spy = jest.spyOn(wrapper.instance(), 'onSubmit')
wrapper.find('form').simulate('submit', mockedEvent)
expect(spy).toHaveBeenCalled()
C'est en fait simple, vous pouvez passer n'importe quel accessoire au composant en le rendant peu profond à l'intérieur du test, comme ça:const wrapper = shallow(<SearchForm history={historyMock} />)
Par ailleurs, dans onSubmit
, vous devez appeler comme this.props.history.Push(...)
.
Maintenant, pour créer une maquette (plus d'informations dans le documentation ), vous pouvez écrire comme ceci dans le test:const historyMock = { Push: jest.fn() };
Gardez à l'esprit que vous vous moquez uniquement de la méthode Push
de l'objet history
, si vous utilisez plus de méthodes à l'intérieur du composant et que vous souhaitez les tester, vous devez créer une maquette pour chacune testée .
Et puis, vous devez affirmer que la maquette Push
a été appelée correctement. Pour ce faire, vous écrivez l'assertion nécessaire:expect(historyMock.Push.mock.calls[0]).toEqual([ (url string), (state object) ]);
Utilisez le (url string)
et (state object)
à affirmer.