Reputation: 1603
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.
Upvotes: 79
Views: 94857
Reputation: 6691
I got the same error on NextJS, and I found the answer here that solved my problem:
https://github.com/FormidableLabs/jest-next-dynamic/issues/22#issuecomment-1030885706
So just remove the test from within the pages
folder into a separate, e.g. __test__
folder. This is a NextJS-specific use case though.
UPDATE:
Since Next introduced app
folder for the new router, this is not an issue anymore, you can store the test files together with the components.
Upvotes: 3
Reputation: 1053
while essentially the same as the answer of Rupesh - you can expose jest
globally without having to import it in each test file - by adding a setup-file to the jest configuration:
"jest": {
"setupFiles": [
"<rootDir>/test-setup.js"
]
}
then add this to test-setup.js
:
import { jest } from '@jest/globals';
global.jest = jest;
also in general ESM support for jest is improved by a test
script in package.json as so:
"scripts": {
"test": "node --no-warnings --experimental-vm-modules $( [ -f ./node_modules/.bin/jest ] && echo ./node_modules/.bin/jest || which jest )"
},
Upvotes: 25
Reputation: 1192
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.
Upvotes: 100