Вы можете проверить это так:
import React from 'react';
import { shallow } from 'enzyme';
import App from './App';
describe('Should handle getGIF event', () => {
let mock, actualFetch;
beforeEach(() => {
mock = jest.fn();
actualFetch = global.fetch;
global.fetch = mock;
});
afterEach(() => {
global.fetch = actualFetch;
});
it('should handle getGIF event', async () => {
const component = shallow(<App />);
component.setState({ query: 'Owl' });
mock.mockResolvedValue({
json: () => Promise.resolve({
data: [{
title: 'the title',
images: { downsized: { url: 'the url' }}
}]
})
});
const form = component.find('form');
await form.props().onSubmit({ preventDefault: () => {} });
expect(mock).toHaveBeenCalledWith('http://api.giphy.com/v1/gifs/search?q=Owl&api_key=iBXhsCDYcnktw8n3WSJvIUQCXRqVv8AP&limit=5'); // Success!
expect(component.state('title')).toBe('the title'); // Success!
expect(component.state('url')).toBe('the url'); // Success!
});
});
Детали
fetch
не может быть определен в среде Node.js, поэтому просто захватите все, что было, и замените его ложным, а затем восстановите, что бы это ни было, - хороший подход.
Используйте .setState
для установки состояния компонента.
Используйте .find
, чтобы получить form
и используйте .props
, чтобы получить доступ к его реквизитам и вызвать его функцию onSubmit
.
Используйте async
функцию тестирования и await
Promise
, возвращаемую onSubmit
, так что это полностью выполняется перед продолжением.
Используйте .state
для запроса состояния компонента.