Проверка ответа и вызова функции библиотеки с использованием fetch с помощью Jest + node-fetch + fetch-mock - PullRequest
0 голосов
/ 07 октября 2018

Я пишу библиотеку JavaScript / React, в которой используется fetch.

. Я использую Jest для тестирования этой библиотеки, и я хотел бы добиться:

  1. Макет HTTP-запросов, чтобы не отправлять реальные вызовы и манипулировать ответами (макет бэкэнд-сервера), поэтому я использую fetch-mock
  2. Проверка переданных параметров функции fetch

Чтобы достичь первого балла, мне нужно сделать

fetchMock.post(`${API_URL}/sessions`, {
  body: JSON.stringify({
    token: 'this-is-your-token'
  }),
  status: 201
})

Для того, чтобы достичь второго балла, мне нужно сделать

const spiedFetch = jest.spyOn(global, 'fetch')
// ...
expect(spiedFetch).toHaveBeenCalledTimes(1)

(последняя строка находится в серии describe() и it()).

У меня есть первый тест, который гарантирует, что ответ имеет поле token и т. Д., Ивторой тест гарантирует, что fetch был вызван один раз.

Когда я запускаю их, первый проходит, а второй - не проходит.Когда я комментирую fetchMock.post(...), первый отказывает, а второй проходит.

Исходя из этого, я думаю, fetch-mock и jest.spyOn несовместимы.

Вопросы:

  1. Правильно ли я думаю, что fetch-mock и jest.spyOn несовместимы?
  2. Как мне выполнить тестирование ответа fetch И переданных параметров?(Я хочу убедиться, что это HTTP-глагол, а переданные заголовки таковы).
  3. Я мог бы подумать о том, чтобы использовать fetch-mock как есть, но использовать jest.spyOn в функции моегоlib, которая будет встраивать fetch.Это нормальный способ сделать это?

ОБНОВЛЕНИЕ: Я попробовал свою точку 3, и она работает.

1 Ответ

0 голосов
/ 08 октября 2018

jest.spyOn заменяет исходную функцию оболочкой .

const fetchMock = require('fetch-mock'); не сразу изменяет глобальный fetch, но , как только функция, подобнаяfetchMock.get называется , он заменяет глобальный fetch.

Поскольку оба они работают путем изменения глобального fetch, их сложно использовать вместе.

Как выясняется, каждый раз, когда метод, подобный fetchMock.get, называется глобальным, fetch заменяется, но если jest.spyOn вызывается после , все такие методы вызываются на fetchMock, тогдана самом деле они оба будут работать, поскольку jest.spyOn обернет и отследит окончательно замененный fetch.

Сказав это, на самом деле нет необходимости использовать jest.spyOn(global, 'fetch'), если вы уже используете fetch-mockтак как fetch-mock предоставляет доступ ко всем вызовам, которые были сделаны на fetch.

. Чтобы напрямую принимать вызовы, вы можете получить к ним доступ, используя fetchMock.calls().

* 1039.* Еще проще просто позвонить fetchMock.done() в конце теста, чтобы утверждать, что fetch использовался eточно так, как и ожидалось.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...