我在测试我的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实现,但还没有感觉到。
答案 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