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

时间:2017-08-23 14:08:15

标签: unit-testing react-native fetch-api jest

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

我的设置文件如下所示:

</tbody>                                    
    <tr id="1">
        <td>1</td>
        <td class="legal-name"><a href="code/2138/"></a></td>
    </tr>                       
    <tr id="1">
        <td>2</td>
        <td class="legal-name"><a href="code/2549/"></a></td>
    </tr>
</tbody>    

但是,我在所有需要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));
};

我已尝试从ReferenceError: FormData is not defined 下的react-native-mock导入FormData文件,但它没有用。

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

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

2 个答案:

答案 0 :(得分:11)

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

在测试开始时我添加了:

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

这将确保所有地方

const formData = new FormData()

将使用我的模拟。

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

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

答案 1 :(得分:1)

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

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"
        ]
      }
}

然后在与setupJest.js相同的文件夹上创建package.json文件,并在其中包含以下代码

global.FormData = require('FormData')

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