21

I'm in the early stages of a new app that so far just uses vanilla JS. I'm trying to use ES6 modules for my Jest unit tests, so I followed the 2020 updated instructions on making this possible.

However, after following those instructions, I get the error ReferenceError: jest is not defined when running my unit test.

Here's my 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": {}
}

Below is my test file. The error occurs due to the jest.fn call:

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

Any ideas on why this is happening? I'm confident that the issue has to do with the steps I followed to support ES6 modules. Prior to these changes, my test ran fine when I simply pasted the getTotalNumPeople function in my test file.

If I comment out mocking my function, I then get a ReferenceError about fetch not being defined (since getTotalNumPeople uses fetch). So it's not just jest that's not defined.

I notice that if I do not specify jest-environment-node as my test environment, the error changes to ReferenceError: global is not defined due to referring to global.fetch in my test. Just thought I'd note that in case that helps.

Eric
  • 613
  • 1
  • 5
  • 11
  • Maybe I'm missing something but I was expecting your package.json to have a script like this: `"test": "jest"` so jest runs as a cli. More here: https://jestjs.io/docs/en/getting-started – stealththeninja Dec 08 '20 at 04:36
  • @stealththeninja I did have that script originally. But after following the instructions for enabling ES6 modules with Jest, I replaced that script with `"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"` – Eric Dec 08 '20 at 04:41

1 Answers1

42

It looks like you didn’t import jest, so you have to just add this line to the top of the file:

import {jest} from '@jest/globals'

For more details, see this issue on native support for ES6 modules in Jest.

Eric
  • 613
  • 1
  • 5
  • 11
Rupesh
  • 556
  • 5
  • 4