提问者:小点点

如何真正调用fetch in Jest测试


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

我注意到使用请求超文本传输协议模块不工作。像我在非测试代码中通常做的那样,调用getch会给出一个错误:Timeout-在jest.setTimeout指定的5000毫秒超时内没有调用异步回调。API返回更少比我在浏览器中调用它时的一秒钟还多。我大约使用下面的代码来进行测试,但我也只是简单地从测试中返回了提取函数,而没有使用类似的失败:

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();
        });
    });
});

奇怪的是,在超时到达后,我可以看到一个错误消息作为控制台消息:原因: ReaticeError: XMLHttpRequest未定义

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


共1个答案

匿名用户

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

你没有理由做不到。

下面是一个简单的工作示例,它从JSONPlacehold中提取数据:

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在幕后所做的所有工作(定义全局变量,如descriptionbeforealtest,等等,将代码文件路由到传输器,处理模块缓存和模拟等),最终实际的测试只是JavaScript代码,Jest只运行它找到的任何JavaScript代码,因此,在单元测试中运行什么实际上没有任何限制。