J'échange pour plaisanter de moka, et je me demande s'il existe un moyen d'espionner une méthode de réaction. Par exemple, disons que j'ai la méthode suivante dans mon composant (Ignore la bibliothèque sdk, elle construit simplement un appel jquery ajax):
getData() {
sdk.getJSON('/someURL').done(data => {
this.setState({data});
});
}
En utilisant sinon je testerais cela en espionnant le prototype comme suit:
it('should call getData', () => {
sinon.spy(Component.prototype, 'getData');
mount(<Component />);
expect(Component.prototype.getData.calledOnce).to.be.true;
});
cela assurerait une couverture de code sans se moquer de la méthode. Y a-t-il une fonctionnalité similaire en plaisanterie?
EDIT: De plus, si cette fonctionnalité n’existe pas, quelle est la meilleure stratégie pour tester les appels d’API?
Il y a la méthode spyOn
, introduite avec v19 il y a quelques jours, qui fait exactement ce que vous recherchez
En fait, vous pouvez utiliser jest.spyOn jest.spyOn
Si la méthode est appelée lors de la création du composant, utilisez:
import { mount } from 'enzyme';
describe('My component', () => {
it('should call getData', () => {
const spy = jest.spyOn(Component.prototype, 'getData');
mount(<Component />);
expect(Component.prototype.getData).toHaveBeenCalledTimes(1)
});
})
ou si vous l'avez dans votre DOM et dans votre méthode, utilisez bind :
import { shallow } from 'enzyme';
describe('My component', () => {
it('should call getData', () => {
const wrapper = shallow(<Component />);
const instance = wrapper.instance()
const spy = jest.spyOn(instance, 'getData');
wrapper.find('button').simulate('click')
expect(spy).toHaveBeenCalledTimes(1)
});
})
Vous pouvez choisir la nouvelle méthode spyOn
ou les suivantes devraient également fonctionner correctement.
it('should call getData', () => {
Component.prototype.getData = jest.fn(Component.prototype.getData);
expect(Component.prototype.getData).toBeCalled();
});
J'utilise Jest avec React 16.8 - Cela a fonctionné pour moi:
it("lifecycle method should have been called", () => {
jest.spyOn(RedirectingOverlay.prototype, 'componentWillUnmount');
jest.spyOn(RedirectingOverlay.prototype, 'componentDidMount');
const wrapper = mount(<RedirectingOverlay message="Hi There!"/>);
expect(RedirectingOverlay.prototype.componentDidMount).toHaveBeenCalledTimes(1)
wrapper.unmount()
expect(RedirectingOverlay.prototype.componentWillUnmount).toHaveBeenCalledTimes(1)
})
En utilisant également:
"enzyme": "^3.6.0"
"jest": "23.5.0"
"enzyme-adapter-react-16": "^1.5.0"