unit tests test react medium example create app unit-testing react-native jestjs

unit testing - tests - Cómo realizar pruebas unitarias de llamadas a la API con fock() simulado en reaccion-native con Jest



snapshot testing react (5)

En React Native utilizo fetch para realizar solicitudes de red, sin embargo fetch no es un módulo explícitamente requerido, por lo que parece imposible burlarse de Jest.

Incluso tratar de llamar a un método que utiliza la fetch en una prueba resultará en:

ReferenceError: fetch no está definido

¿Hay alguna forma de probar dichas solicitudes de API para reaccionar de forma nativa con Jest?


Como lo recomendó @ArthurDenture, puede usar fetch-mock , pero hay algunos paquetes adicionales que deberá instalar para que funcione con React Native y Jest:

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

A continuación, puede simular solicitudes de recuperación en sus pruebas. Aquí hay un ejemplo:

// __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(); });


Dentro de tu caso de prueba puedes simular cualquier función que desees utilizando los simulacros de Jest:

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

Este enfoque funciona solo para los casos de prueba basados ​​en la promesa (ver pit en los documentos de Jest).

En la medida en que fetch es una función asíncrona, debe ejecutar todas sus pruebas utilizando pit (lea más acerca de las pruebas asíncronas here ).


En lugar de hacer rodar su propio simulacro, puede usar el paquete jest-fetch-mock npm para anular el objeto de captación global. Ese paquete le permite configurar respuestas falsas y verificar las solicitudes enviadas. Vea ese enlace para ver ejemplos extensos de uso.


Otro enfoque en el que te burlas del objeto de fetch global:

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 : {}; }, }); }); }); };

El método auxiliar anterior se puede modificar de la forma que desee :-) Espero que ayude a alguien


Resolví esto agregando isomorphic-fetch .

$ npm install --save isomorphic-fetch

y usándolo como

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

Whatwg-Fetch podría funcionar también