Я хотел бы протестировать небольшое веб-приложение React, в котором я использую глобальный метод fetch
.
Я пытался имитировать fetch
таким образом:
global.fetch = jest.spyOn(global, 'fetch').mockImplementation(endpoint =>
Promise.resolve({
json: () => Promise.resolve(mockResponse)
})
);
. .. но макет, кажется, игнорируется, в то время как встроенный fetch
, похоже, используется: Error: connect ECONNREFUSED 127.0.0.1:80 ...
выглядит как неудачный вызов встроенного fetch
.
Затем я попытался используйте jest.fn
вместо jest.spyOn
:
global.fetch = jest.fn(endpoint =>
Promise.resolve({
json: () => Promise.resolve(mockResponse)
})
);
... и был удивлен, увидев другую ошибку. Теперь макет, кажется, принят во внимание, но в то же время работает некорректно:
TypeError: Cannot read property 'then' of undefined
8 | this.updateTypes = this.props.updateTypes;
9 | this.updateTimeline = this.props.updateTimeline;
> 10 | fetch('/timeline/tags')
| ^
11 | .then(res => res.json())
12 | .then(tags => tags.map(tag => <option value={tag} key={tag} />))
13 | .then(options => options.sort((a, b) => a.key.localeCompare(b.key)))
Честно говоря, я нахожу документацию Jest и React Testing Library немного запутанной. В чем может быть проблема с тем, что я делаю?
Edit
Компонент React, который я пытаюсь протестировать, называется «App», был создан с помощью Create React App и был изменен для включения звонок на fetch
. Я с радостью могу предоставить код для этого компонента, но я считаю, что проблема заключается в тестах.
В начале моего файла App.test.js
я import React from 'react';
, затем import { render, fireEvent, waitFor, screen } from '@testing-library/react';
и, наконец, import App from './App';
. Впоследствии я пытаюсь имитировать fetch
одним из описанных мной способов, а затем объявляю следующий тест:
test('renders a list of items, upon request', async () => {
const app = render(<App />);
fireEvent.click(screen.getByText('Update'));
await waitFor(() => screen.getByRole('list'));
expect(screen.getByRole('list')).toBeInTheDocument();
expect(screen.getByRole('list')).toHaveClass('Timeline');
});
Наконец, я заканчиваю свой тестовый файл global.fetch.mockRestore();
.