Unit testing React Native-在单元测试中模拟FormData

Unit testing React Native-在单元测试中模拟FormData,unit-testing,react-native,fetch-api,jestjs,Unit Testing,React Native,Fetch Api,Jestjs,我在测试我的thunks时遇到了问题,因为我的许多API调用都使用FormData,我似乎不知道如何在测试中模拟它。我在开玩笑 我的安装文件如下所示: import 'isomorphic-fetch'; // Mocking the global.fetch included in React Native global.fetch = jest.fn(); // Helper to mock a success response (only once) fetch.mockRespons

我在测试我的thunks时遇到了问题,因为我的许多API调用都使用FormData,我似乎不知道如何在测试中模拟它。我在开玩笑

我的安装文件如下所示:

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));
};
但是,在所有需要FormData的测试中,我都会遇到以下错误:

ReferenceError: FormData is not defined
我曾尝试从
src/Libraries/Network/FormData
下的
react native mock
导入FormData文件,但没有成功

所以我想知道是否有人做过这样的事


一般来说,我很难找到在React Native中模拟
获取
请求的最佳方法,所以这里的任何建议都很好。我尝试了
jest-fetch-mock
lib(并打开了一个关于FormData的问题),尝试了使用
nock
进行设置(运气不好),以及这个简单的jest实现,但感觉还不太对劲

这是一个老问题,但自从我在谷歌的第一页找到它以来,我做了如下工作:

在测试开始时,我添加了:

function FormDataMock() {
    this.append = jest.fn();
}
global.FormData = FormDataMock
这将确保所有这样做的地方

const formData = new FormData()
将使用我的模拟

当然,我只是嘲笑了“append”方法,因为在我的例子中,它是我唯一需要的东西。我正在测试的函数返回了创建的FormData对象,我这样做是为了测试所有操作是否都按预期工作:

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

将以下代码添加到测试文件的开头

global.FormData = require('FormData')

在package.json中包含类似的内容

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

因此,
jest
每次运行测试时都会调用
setupJest.js
,您是否找到了适合您的解决方案?还没有,不幸的是,您是否能够将此解决方案与使用
FormData.append的已安装外部库一起使用?在我的简单测试中,我尝试将上面的
FormDataMock
代码添加到
之前的
,但是,我仍然从项目中使用的库中获取
FormData未定义。谢谢。我只使用本地代码测试了它,没有使用外部库。你试图测试的库是什么?库是,尽管我实际上不想自己测试它。这导致我的基本测试失败,可能只是因为它是我的React原生项目中的一个依赖项???您是否尝试在导入任何其他库之前添加
global.FormData=…
?在导入任何其他库之前添加
global.FormData=…
对我不起作用。最终起作用的是:
jest.mock('react-native-aws3',()=>{return{Request:{FormData:{}})。我不确定这是否是正确的做法,因为看起来我必须为我的许多依赖项这样做。
global.FormData = require('FormData')