Comment tester les appels D'API avec mocked fetch () dans react-native avec Jest

Dans React Native, j'utilise fetch pour effectuer des requêtes réseau, cependant fetch n'est pas un module explicitement requis, il est donc apparemment impossible de se moquer en plaisantant.

, Même en essayant d'appeler une méthode qui utilise fetch dans un test permettra:

ReferenceError: fetch n'est pas défini

Existe-t-il un moyen de tester de telles requêtes API dans react native avec Jest?

22
demandé sur Ronan Boiteau 2016-03-17 22:16:04

5 réponses

Dans votre cas de test, vous pouvez simuler n'importe quelle fonction en utilisant les mocks de Jest:

fetch = jest.fn(() => new Promise(resolve => resolve()));

Cette approche ne fonctionne que pour les cas de test basés sur la promesse (voir pit dans les documents Jest).

Dans la mesure où fetch est une fonction asynchrone, vous devez exécuter tous vos tests en utilisant pit (en savoir plus sur les tests asynchrones ici).

19
répondu Alexey Kureev 2016-03-17 20:48:18

Plutôt que de lancer votre propre maquette, vous pouvez utiliser le paquet jest-fetch-mock npm pour remplacer l'objet global fetch. Ce paquet vous permet de configurer de fausses réponses et de vérifier les demandes envoyées. Voir ce lien pour des exemples d'utilisation étendus.

7
répondu ArthurDenture 2016-12-07 18:47:49

Une autre approche où vous vous moquez de l'objet global fetch:

const mockSuccesfulResponse = (
  status = 200,
  method = RequestType.GET,
  returnBody?: object
) => {
  global.fetch = jest.fn().mockImplementationOnce(() => {
    return new Promise((resolve, reject) => {
      resolve({
        ok: true,
        status,
        json: () => {
          return returnBody ? returnBody : {};
        },
      });
    });
  });
};

La méthode d'aide ci-dessus peut être modifiée comme vous le souhaitez: -) J'espère que cela aide quelqu'un

3
répondu jhm 2018-04-04 14:08:28

J'ai résolu cela en ajoutant isomorphic-fetch.

$ npm install --save isomorphic-fetch

Et l'utiliser comme

import fetch from 'isomorphic-fetch';
...
fetch('http://foo.com');

Whatwg-fetch pourrait aussi fonctionner

1
répondu Harry Moreno 2018-05-15 15:48:55

Comme @ArthurDenture recommandé, vous pouvez utiliser fetch-mock , mais il y a quelques paquets supplémentaires que vous devrez installer pour le faire fonctionner avec React Native et Jest:

$ npm install --save-dev fetch-mock
$ npm install --save-dev babel-plugin-transform-runtime
$ npm install --save-dev babel-preset-env

Vous pouvez ensuite simuler des requêtes fetch dans vos tests. Voici un exemple:

// __tests__/App.test.js
import React from 'react';
import App from '../App';
import fetchMock from 'fetch-mock';
import renderer from 'react-test-renderer';

it('renders without crashing', () => {
  fetchMock.mock('*', 'Hello World!');
  const rendered = renderer.create(<App />).toJSON();
  expect(rendered).toBeTruthy();
});
0
répondu Tom Aranda 2018-06-08 22:46:06