У меня есть функция, которая вызывает fetch() и обрабатывает различные случаи данных ответа.
При попытке имитировать функцию глобальной выборки с помощью Jest у меня возникают проблемы с типом Response
.
Мне нужны только свойства response.ok
и response.json
.
Как я могу установить возвращаемые данные fetch
без необходимости выписывать все необходимые свойства?
Мой код:
describe('steam data fetch function', () => {
const fetchMock = jest.spyOn(global, 'fetch').mockImplementation(
jest.fn(() =>
Promise.resolve({
ok: false,
json: () => Promise.resolve({ data: 'empty' }),
})
) as jest.Mock
);
// Begin tests
test('handles invalid data correctly', () => {
fetchMock.mockResolvedValueOnce({
ok: false,
json: () => Promise.resolve({ data: 'test1' }),
}) as jest.Mock;
// expect function using fetch to...
});
// more tests
// each test sets new fetchMock.mockResolvedValueOnce
});
В моем заявлении fetchMock.mockResolvedValueOnce
я сейчас получаю tsError:
Argument of type '{ ok: false; json: () => Promise<{ data: string; }>; }' is not assignable to parameter of type 'Response | Promise<Response>'. Type '{ ok: false; json: () => Promise<{ data: string; }>; }' is missing the following properties from type 'Response': headers, redirected, status, statusText, and 9 more.ts(2345)
Я попытался добавить одно из отсутствующих свойств, что уменьшает недостающие свойства на 1, но я хочу избежать необходимости записывать все свойства.
Решение: Новая рабочая версия из комментариев:
test('handles invalid data correctly', () => {
fetchMock.mockResolvedValueOnce({
ok: false,
json: () => Promise.resolve({ data: 'test1' }),
} as unknown as Response);
// expect function using fetch to...
});
После очень быстрого изучения Response
на MDN кажется, что я мог бы сделать это намного более тщательно, но в данном случае этого решения достаточно.
Забудьте о насмешках fetch()
с помощью Jest. Используйте msw
, чтобы имитировать исходящие HTTP-запросы. mswjs.io
Сначала выполните приведение к unknown
, а затем к нужному типу Response
.
Вот и напиши Promise.resolve({ data: 'empty' } as unknown as Response)
На самом деле мне нужен as unknown as Response
для объекта, отправленного в mockResolvedValueOnce
в качестве аргумента. Но вы указали мне правильное направление, ура!
Использовать настоящий объект Response()?