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