Javascript 如何真正调用fetch in Jest测试

Javascript 如何真正调用fetch in Jest测试,javascript,react-native,asynchronous,jestjs,Javascript,React Native,Asynchronous,Jestjs,在Jest测试中有没有方法调用fetch?我只想调用live API以确保它仍在工作。如果有500个错误或者数据不是我期望的,那么测试应该报告这一点 我注意到使用http模块中的request不起作用。调用fetch,就像我通常在不用于测试的代码中所做的那样,将给出一个错误:Timeout-异步回调没有在jest.setTimeout指定的5000ms超时内调用。当我在浏览器中调用它时,API会在不到一秒钟内返回。我大致使用以下方法来进行测试,但我也只是从测试中返回了fetch函数,而没有使用d

在Jest测试中有没有方法调用
fetch
?我只想调用live API以确保它仍在工作。如果有500个错误或者数据不是我期望的,那么测试应该报告这一点

我注意到使用
http
模块中的
request
不起作用。调用
fetch
,就像我通常在不用于测试的代码中所做的那样,将给出一个错误:
Timeout-异步回调没有在jest.setTimeout指定的5000ms超时内调用。
当我在浏览器中调用它时,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();
        });
    });
});
奇怪的是,在到达超时后,我可以看到一条错误消息作为控制台消息:
原因:ReferenceError:XMLHttpRequest未定义


我如何在Jest测试中对实时API进行实际而非模拟的调用?难道这就是禁止的吗?我不明白为什么这会失败,因为我怀疑在React Native中隐式导入了一些东西,这些东西必须在Jest测试中显式导入,以使
获取
请求
函数工作

抛开关于在单元测试中进行实际网络调用是否是最佳实践的讨论

你没有理由做不到

下面是一个简单的工作示例,可从以下位置提取数据:

导入“同构提取”;
测试('real fetch call',async()=>{
const res=等待取数('https://jsonplaceholder.typicode.com/users/1');
const result=await res.json();
expect(result.name).toBe('Leanne Graham');//成功!
});


通过
Jest
在幕后所做的所有工作(定义全局变量,如
description
beforeal
test
,等等),将代码文件路由到传输器,处理模块缓存和模拟等)最终,实际的测试只是JavaScript代码,
Jest
只运行它找到的任何JavaScript代码,因此在单元测试中运行的内容实际上没有任何限制。

我认为您的方法是错误的。在单元测试中,您不需要检查服务是否处于活动状态,您应该模拟调用并测试处理程序的成功/失败,您不需要执行真正的API调用来实现that@Jony-Y、 假设我疯狂到想检查服务是否还活着。这是允许的吗?理论上一切都是允许的,但听起来不应该在你的测试范围内。您需要测试您的逻辑以及如何处理更改。不是服务或第三方软件包,他们有自己的测试。@Jony-Y,我并不强烈反对。我正在尝试测试一些通常不在移动应用程序适当测试范围内的东西。然而,我该怎么做呢?@Jony-Y集成/功能测试没有错。我同意单元测试应该被隔离,但是功能测试是有时间和地点的。也就是说,为了使用WebAPI,您需要在浏览器环境中运行测试。或者,您可以在测试开始之前尝试将
fetch
polyfill(like)分配给
global
对象。对于希望调用本身使用fetch的代码的任何人,我发现这个建议有助于模拟fetch函数本身:
global.fetch=fetch
其中fetch是您导入的fetch函数。