2017-08-23 2 views
3

Je rencontre des problèmes lors de la mise à l'essai de mes thunk, car plusieurs de mes appels d'API utilisent FormData, et je n'arrive pas à comprendre comment les utiliser lors des tests. J'utilise Jest.React Native - simulant FormData dans les tests unitaires

Mon fichier de configuration ressemble à ceci:

import 'isomorphic-fetch'; 

// Mocking the global.fetch included in React Native 
global.fetch = jest.fn(); 

// Helper to mock a success response (only once) 
fetch.mockResponseSuccess = body => { 
    fetch.mockImplementationOnce(() => 
    Promise.resolve({ json:() => Promise.resolve(JSON.parse(body)) }) 
); 
}; 

// Helper to mock a failure response (only once) 
fetch.mockResponseFailure = error => { 
    fetch.mockImplementationOnce(() => Promise.reject(error)); 
}; 

Cependant, je reçois l'erreur suivante sur tous les tests qui nécessitent FormData:

ReferenceError: FormData is not defined 

J'ai essayé d'importer le fichier FormData de react-native-mock, sous src/Libraries/Network/FormData, mais cela n'a pas fonctionné.

Alors je me demandais si quelqu'un avait eu de la chance en faisant ça?

En général, j'ai du mal à trouver la meilleure façon de se moquer des demandes fetch dans React Native, donc tout conseil ici serait bien. J'ai essayé le jest-fetch-mock lib (et ai ouvert un problème au sujet de FormData), ai essayé la mise en place avec nock (aucune chance), et cette mise en œuvre simple de Jest, mais rien ne semble bon pour le moment.

+0

Avez-vous trouvé une solution qui a fonctionné pour vous? – Marklar

+0

Pas encore, malheureusement – jhm

Répondre

2

C'est une vieille question, mais depuis que je l'ai trouvé dans la première page de Google, va ici ce que je l'ai fait:

au début de mon test, j'ajouté:

function FormDataMock() { 
    this.append = jest.fn(); 
} 
global.FormData = FormDataMock 

cela fera que tous les endroits qui ne

const formData = new FormData() 

utilisera ma maquette.

Bien sûr, je me suis seulement moqué de la méthode 'append', puisque dans mon cas c'était la seule chose dont j'avais besoin. La fonction que je testais retourné l'objet FormData créé et je l'ai fait pour tester si tout a fonctionné comme prévu:

const resultFormData = theFunction() 
expect(resultFormData.append.mock.calls.sort(sortFunc)).toEqual(expected) 
+0

Êtes-vous capable d'utiliser cette solution avec une bibliothèque externe installée qui utilise 'FormData.append'? J'ai essayé d'ajouter le code 'FormDataMock' ci-dessus à' beforeEach' dans mon test simple, cependant, je reçois toujours 'FormData n'est pas défini' depuis une bibliothèque utilisée dans mon projet. Merci. – Marklar

+0

J'ai testé cela uniquement avec du code local, pas avec des bibliothèques externes. Quelle est la bibliothèque que vous avez essayé de tester? – brunovianarezende

+0

La bibliothèque est [react-native-aws3] (https: // github.com/benjreinhart/react-native-aws3), bien que je ne veuille pas le tester moi-même. Cela fait échouer mon test très basique, peut-être juste parce que c'est une dépendance dans mon projet React Native ??? – Marklar

1

Ajoutez le code suivant au début de votre fichier de test

global.FormData = require('FormData') 

ou

ont quelque chose comme ça dans votre package.json

{ 
    "jest": { 
     "preset": "react-native", 
     "transformIgnorePatterns": [ 
      "<rootDir>/node_modules/(?!react-native|tcomb-form-native|ReactUtils|react-native-button)" 
     ], 
     "automock": false, 
     "setupFiles": [ 
      "./setupJest.js" 
     ] 
     } 
} 

Ensuite, créez unfichiersur un même dossier que package.json et avoir le code suivant dans ce

global.FormData = require('FormData') 

Alors que jest appelle le setupJest.js chaque fois jest court essai