运行单元测试时出现“ReferenceError:jest未定义”

问题描述 投票:0回答:3

我正处于一个新应用程序的早期阶段,到目前为止,该应用程序仅使用普通 JS。我正在尝试使用 ES6 模块进行 Jest 单元测试,因此我遵循了 2020 更新的说明 来实现这一点。

但是,按照这些说明进行操作后,我在运行单元测试时收到错误

ReferenceError: jest is not defined

这是我的package.json:

{
  "version": "1.0.0",
  "main": "app.js",
  "type": "module",
  "jest": {
    "testEnvironment": "jest-environment-node",
    "transform": {}
  },
  "scripts": {
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
    "start": "node server.js"
  },
  "license": "ISC",
  "devDependencies": {
    "express": "^4.17.1",
    "jest": "^26.6.3",
    "jest-environment-node": "^26.6.2",
    "open": "^7.3.0"
  },
  "dependencies": {}
}

下面是我的测试文件。由于 jest.fn 调用而发生错误:

import { getTotalNumPeople } from "./app.js";


test("Get total number of people", async () => {
    global.fetch = jest.fn(() => Promise.resolve({
            json: () => Promise.resolve({count: 15})
        })
    )
    
    expect(await getTotalNumPeople()).toBe(15);
});

关于为什么会发生这种情况有什么想法吗?我确信该问题与我支持 ES6 模块所遵循的步骤有关。在这些更改之前,当我简单地将

getTotalNumPeople
函数粘贴到我的测试文件中时,我的测试运行良好。

如果我注释掉模拟我的函数,则会收到一个关于未定义 fetch 的 ReferenceError (因为

getTotalNumPeople
使用 fetch)。所以不仅仅是
jest
没有定义。

我注意到,如果我不指定

jest-environment-node
作为我的测试环境,由于在我的测试中引用
ReferenceError: global is not defined
,错误会更改为
global.fetch
。只是想我会注意到这一点,以防有帮助。

javascript node.js jestjs es6-modules
3个回答
79
投票

看起来你没有导入 jest,所以你只需将此行添加到文件顶部:

import {jest} from '@jest/globals'

有关更多详细信息,请参阅此问题,了解 Jest 中对 ES6 模块的本机支持。


13
投票

虽然与 Rupesh 的答案基本相同 - 您可以全局公开

jest
,而无需将其导入到每个测试文件中 - 通过将安装文件添加到笑话配置中:

"jest": {
    "setupFiles": [
        "<rootDir>/test-setup.js"
    ]
}

然后将其添加到

test-setup.js

import { jest } from '@jest/globals';

global.jest = jest;

一般来说,ESM 对笑话的支持是通过 package.json 中的

test
脚本改进的,如下所示:

"scripts": {
    "test": "node --no-warnings --experimental-vm-modules $( [ -f ./node_modules/.bin/jest ] && echo ./node_modules/.bin/jest || which jest )"
},

1
投票

我在 NextJS 上遇到了同样的错误,我在这里找到了解决我的问题的答案:

https://github.com/FormidableLabs/jest-next-dynamic/issues/22#issuecomment-1030885706

因此,只需将

pages
文件夹中的测试删除到单独的文件夹中即可,例如
__test__
文件夹。但这是 NextJS 特定的用例。

更新: 由于 Next 为新路由器引入了

app
文件夹,这不再是问题,您可以将测试文件与组件存储在一起。

© www.soinside.com 2019 - 2024. All rights reserved.