是否可以在Jest测试中调用fetch
?我只想调用实时API,以确保它仍在工作。如果有500个错误或数据不是我期望的值,则测试应报告该错误。
我注意到无法使用request
模块中的http
。像我通常在非测试代码中一样,调用fetch
会产生错误:Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
当我在浏览器中调用API时,返回的时间不到一秒钟。我大致使用以下内容进行测试,但我也只是从测试中返回了fetch
函数,而没有使用done
,但同样没有成功:
import { JestEnvironment } from "@jest/environment";
import 'isomorphic-fetch';
import { request, } from "http";
jest.mock('../MY-API');
describe('tests of score structuring and display', () => {
test('call API - happy path', (done) => {
fetch(API).then(
res => res.json()
).then(res => {
expect(Array.isArray(response)).toBe(true);
console.log(`success: ${success}`);
done();
}).catch(reason => {
console.log(`reason: ${reason}`);
expect(reason).not.toBeTruthy();
done();
});
});
});
奇怪的是,在达到超时时间后,我会看到一条错误消息,显示为控制台消息:reason: ReferenceError: XMLHttpRequest is not defined
如何在Jest测试中对实时API进行实际而不是模拟的调用?只是禁止这样做吗?我不知道为什么在给定documentation的情况下失败,所以我怀疑在React-Native中隐式导入了某些内容,必须在Jest测试中显式导入才能进行fetch
或{{ 1}}函数的工作。
答案 0 :(得分:1)
搁置有关在单元测试中进行实际网络调用是否是最佳实践的任何讨论...
没有理由您不能这样做。
这是一个简单的工作示例,可从JSONPlaceholder中提取数据:
import 'isomorphic-fetch';
test('real fetch call', async () => {
const res = await fetch('https://jsonplaceholder.typicode.com/users/1');
const result = await res.json();
expect(result.name).toBe('Leanne Graham'); // Success!
});
Jest
的所有工作都在后台进行(定义了describe
,beforeAll
,test
等全局变量,将代码文件路由到编译器,处理模块缓存和模拟等),最终实际的测试只是JavaScript代码,而Jest
可以运行它发现的任何JavaScript代码,因此,在单元测试中可以运行的内容实际上没有任何限制。