首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React Native -在单元测试中模拟FormData

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

Stack Overflow用户
提问于 2017-08-23 22:08:15
回答 2查看 9.4K关注 0票数 9

我在测试我的thunk时遇到了问题,因为我的许多API调用都在使用FormData,而我似乎不知道如何在测试中模拟这一点。我使用的是Jest。

我的设置文件如下所示:

代码语言:javascript
复制
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的测试中都得到了以下错误:

代码语言:javascript
复制
ReferenceError: FormData is not defined

我尝试过在src/Libraries/Network/FormData下从react-native-mock导入FormData文件,但没有成功。

所以我想知道是否有人有幸做到这一点?

总的来说,我很难找出在React Native中模拟fetch请求的最好方法,所以这里的任何建议都会很好。我已经尝试了Jest (并打开了一个关于FormData的问题),尝试使用nock进行设置(不太走运),以及这个简单的jest-fetch-mock实现,但是感觉还没有什么是正确的。

EN

回答 2

Stack Overflow用户

发布于 2017-10-26 01:19:52

这是一个古老的问题,但由于我在google的第一页找到了它,下面是我所做的:

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

代码语言:javascript
复制
function FormDataMock() {
    this.append = jest.fn();
}
global.FormData = FormDataMock

这将确保所有这样做的地方

代码语言:javascript
复制
const formData = new FormData()

将使用我的模拟。

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

代码语言:javascript
复制
const resultFormData = theFunction()
expect(resultFormData.append.mock.calls.sort(sortFunc)).toEqual(expected)
票数 21
EN

Stack Overflow用户

发布于 2017-12-13 17:55:24

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

代码语言:javascript
复制
global.FormData = require('FormData')

在你的package.json中有类似这样的东西

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

然后在package.json所在的文件夹中创建一个setupJest.js文件,并在其中包含以下代码

代码语言:javascript
复制
global.FormData = require('FormData')

以便jest在每次jest运行测试时调用setupJest.js

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45842088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档