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

jhm*_*jhm 7 unit-testing jest react-native fetch-api

我在测试我的thunk时遇到了问题,因为我的许多API调用都在使用FormData,而我似乎无法弄清楚如何在测试中模拟它.我正在使用Jest.

我的安装文件如下所示:

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));
};
Run Code Online (Sandbox Code Playgroud)

但是,我在所有需要FormData的测试中收到以下错误:

ReferenceError: FormData is not defined
Run Code Online (Sandbox Code Playgroud)

我试图从导入FORMDATA文件react-native-mock,下src/Libraries/Network/FormData,但没有奏效.

所以我想知道是否有人有这样的运气?

总的来说,我很难找到fetch在React Native中模拟请求的最佳方法,所以这里的任何建议都会很好.我已经尝试了jest-fetch-mocklib(并打开了一个关于FormData的问题),尝试设置nock(没有运气),这个简单的Jest实现,但还没有感觉到.

bru*_*nde 15

这是一个老问题,但是因为我已经在google的第一页找到了它,所以这就是我所做的:

在测试开始时我添加了:

function FormDataMock() {
    this.append = jest.fn();
}
global.FormData = FormDataMock
Run Code Online (Sandbox Code Playgroud)

这将确保所有的地方

const formData = new FormData()
Run Code Online (Sandbox Code Playgroud)

将使用我的模拟.

当然,我只是嘲笑'追加'方法,因为在我的情况下,这是我唯一需要的东西.我正在测试的函数返回了创建的FormData对象,我这样做是为了测试是否所有工作都按预期工作:

const resultFormData = theFunction()
expect(resultFormData.append.mock.calls.sort(sortFunc)).toEqual(expected)
Run Code Online (Sandbox Code Playgroud)


Rez*_*aei 5

这似乎适用于我的情况:

// @ts-ignore
global.FormData = require('react-native/Libraries/Network/FormData');
Run Code Online (Sandbox Code Playgroud)