Как реально вызвать fetch в Jest test - PullRequest
0 голосов
/ 03 апреля 2019

Есть ли способ вызвать fetch в тесте Jest?Я просто хочу вызвать живой API, чтобы убедиться, что он все еще работает.Если есть 500 ошибок или данные не соответствуют ожиданиям, тест должен сообщить об этом.

Я заметил, что использование request из модуля http не работает.Вызов fetch, как я обычно делаю в коде, который не предназначен для тестирования, выдаст ошибку: Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout. API возвращает менее чем за секунду, когда я вызываю его в браузере.Я использую примерно следующее для проведения теста, но я также просто возвратил функцию fetch из теста без использования done с аналогичным отсутствием успеха:

import { JestEnvironment } from "@jest/environment";
import 'isomorphic-fetch';
import { request, } from "http";
jest.mock('../MY-API');

describe('tests of score structuring and display', () => {
    test('call API - happy path', (done) => {
        fetch(API).then(
            res => res.json()
        ).then(res => {
            expect(Array.isArray(response)).toBe(true);
            console.log(`success: ${success}`);
            done();
        }).catch(reason => {
            console.log(`reason: ${reason}`);
            expect(reason).not.toBeTruthy();
            done();
        });
    });
});

Как ни странно, естьсообщение об ошибке я вижу в виде сообщения консоли после истечения времени ожидания: reason: ReferenceError: XMLHttpRequest is not defined

Как я могу сделать реальный, а не поддельный вызов живого API в тесте Jest?Это просто запрещено?Я не понимаю, почему это не сработало, учитывая документацию , поэтому я подозреваю, что есть что-то, что неявно импортируется в React-Native, которое должно быть явно импортировано в тест Jest, чтобы сделать fetch или request функция работы.

1 Ответ

1 голос
/ 04 апреля 2019

Оставляя в стороне любые дискуссии о том, является ли выполнение реальных сетевых вызовов в модульных тестах наилучшей практикой ...

Нет причины, по которой вы не смогли бы сделать это.

Вот простой рабочий пример, извлекающий данные из JSONPlaceholder :

import 'isomorphic-fetch';

test('real fetch call', async () => {
  const res = await fetch('https://jsonplaceholder.typicode.com/users/1');
  const result = await res.json();
  expect(result.name).toBe('Leanne Graham');  // Success!
});

Со всей работой, которую Jest выполняет за кулисами (определяет глобальные переменные, такие как describe, beforeAll, test и т. Д., Направляет файлы кода на транспортеры, обрабатывает кеширование и mocking модуля и т. Д.), В конечном счете, настоящие тесты - это просто код JavaScript, а Jest просто запускает любой код JavaScript, который он находит, поэтому на самом деле нет никаких ограничений на то, что вы можете запускать в своих модульных тестах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...