无法从玩笑测试中访问内置 Node.js `fetch` 函数

kor*_*ral 10 javascript fetch node.js jestjs

我有一个具有如下功能的文件:

export async function loginNextAuth(displayName, password) {
    const response = await fetch('/api/auth/callback/credentials')
}
Run Code Online (Sandbox Code Playgroud)

请注意,没有导入,这是全局命名空间中的内置 Node.js 获取函数。这在剧作家测试和常规代码中效果很好。

由于某种原因,在 Jest 测试中运行时globalglobalThis都不具有该fetch属性。这会导致笑话错误,指出该fetch变量未声明。

jest 测试中返回的结果process.version与我在开发中使用的 Node 版本相同。

是一个类似的 SO 问题,但是 OP 正在使用从模块导入的外部获取函数。

更新:节点版本为v18.12.1

有问题的错误:

    const response = await fetch("/api/auth/callback/credentials", {
                     ^

ReferenceError: fetch is not defined
    at Object.loginNextAuth (web_app/lib/tests/jest/login.js:8:22)
    at loginAs (web_app/pages/permissions.jest.js:22:71)
Run Code Online (Sandbox Code Playgroud)

小智 7

使用 Node 18 时,Jest 删除了对 fetch 的全局引用。

解决方法是将其添加到jest.config.js文件中的全局变量中。

globals: {
  fetch: global.fetch,
}
Run Code Online (Sandbox Code Playgroud)

其他一些需要记住的潜在问题:

  1. 您的 Node fetch 将需要一个绝对 URL,而不是相对 URL。
  2. fetch 不使用 Node 的 http 模块,因此 Nock 等工具当前无法拦截所做的调用。https://github.com/nock/nock/issues/2336

  • 是的,但这正是自版本 28 以来它不应该做的事情,根据他们的文档:https://jestjs.io/blog/2022/04/25/jest-28#all-nodejs-globals (2认同)

avi*_*avi 5

对于那些仍在寻找答案的人,fetchAPI 仅在 Jest v28+ 中的 Jest 节点测试环境中可用,如本评论中所指出的。要访问它,您必须在测试环境(Jest 的默认测试环境)中运行测试node,而不是在jsdom. 您可以添加testEnvironment: "node"到您的笑话配置中,或者如果您想针对特定测试文件更改它,您可以@jest-environment node在测试文件顶部添加一个文档块。请参阅https://jestjs.io/docs/configuration#testenvironment-string