Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

React Native - mocking FormData in unit tests

I'm having issues testing my thunks, as many of my API calls are using FormData, and I can't seem to figure out how to mock this in tests. I'm using Jest.

My setup file looks like this:

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));
};

However, I get the following error on all tests that require FormData:

ReferenceError: FormData is not defined

I've tried importing the FormData file from react-native-mock, under src/Libraries/Network/FormData, but it didn't work.

So I was wondering if anyone has had any luck doing this?

In general, I'm having a hard time figuring out the best way to mock fetch requests in React Native, so any advice here would be nice. I've tried the jest-fetch-mock lib (and opened an issue about FormData), tried setting up with nock (no luck), and this plain Jest implementation, but nothing feels right yet.

like image 364
jhm Avatar asked Aug 23 '17 14:08

jhm


3 Answers

this seems working in my case:

// @ts-ignore
global.FormData = require('react-native/Libraries/Network/FormData');
like image 77
Reza Babaei Avatar answered Oct 14 '22 02:10

Reza Babaei


This is an old question, but since I've found it in first page at google, here goes what I've done:

at the beginning of my test I added:

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

this will make sure all places that do

const formData = new FormData()

will use my mock.

Of course, I've only mocked the 'append' method, since in my case it was the only thing I needed. The function that I was testing returned the created FormData object and I did this to test if all worked as expected:

const resultFormData = theFunction()
expect(resultFormData.append.mock.calls.sort(sortFunc)).toEqual(expected)
like image 24
brunovianarezende Avatar answered Oct 14 '22 01:10

brunovianarezende


Add the following code to beginning of your test file

global.FormData = require('FormData')

or

have something like this in your package.json

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

Then create a setupJest.js file on same folder as package.json and have following code in it

global.FormData = require('FormData')

So that jest calls the setupJest.js every time jest runs test

like image 39
Susth Avatar answered Oct 14 '22 02:10

Susth