Reputation: 9574
I have a nestjs monorepo application with working tests via Jest. This is in relation to the global unit tests which take their configuration from the nestjs CLI-created configuration within package.json.
My storage.service.ts uses jimp
in one of its methods to resize an image.
This has @jimp/types
dependency that depends on @jimp/gif
which depends on gifwrap
.
For every test that runs in my console, I see this error:
ReferenceError: You are trying to `import` a file after the Jest environment has been torn down.
at node_modules/.pnpm/[email protected]/node_modules/gifwrap/src/gifcodec.js:7:15
I'm also using beforeAll() and afterAll() hook to close the nestjs module.
Jest config:
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": ".",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "./coverage",
"testEnvironment": "node",
"roots": [
"<rootDir>/apps/",
"<rootDir>/libs/"
],
"moduleNameMapper": {
...
How can I silence this error or perhaps even be as bold as fixing it?
Upvotes: 9
Views: 2851
Reputation: 413
Configuring the timers
in jest config to modern
solved the problem for me: jest-docs
"timers": "modern",
Upvotes: 2
Reputation: 111
Not sure if it will help your case, but the way I solved it in my typescript project is by mocking the jimp import itself. I was testing a class that used some classes that contained Jimp. Instead of mocking all of those, mocking jimp was easier.
jest.mock('jimp', () => {
return {};
}
I put this below my imports and before my tests. Depending on what you're doing, you might need to go deeper in your mock as well. Example:
jest.mock('jimp', () => {
return {
read: jest.fn().mockImplementation(),
};
});
I did it on jest 25, but I assume it works in most other versions as well.
My jest.config.js file:
module.exports = {
moduleFileExtensions: ['js', 'json', 'ts'],
rootDir: 'src',
testRegex: '\\.spec\\.ts$',
transform: {
'^.+\\.(t|j)s$': 'ts-jest',
},
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/$1',
'^src/(.*)$': '<rootDir>/$1',
},
testPathIgnorePatterns: ['e2e/'],
coverageDirectory: '../coverage',
testEnvironment: 'node',
};
process.env = Object.assign(process.env, {
APP_ENV: 'development',
});
Upvotes: 0
Reputation: 685
I had the same problem, and the issue occurs only if the test is synchronous.
A minimal timeout solves the problem:
afterAll(async () => {
await new Promise(resolve => setTimeout(resolve));
});
or
afterAll(done => {
setTimeout(done);
});
Upvotes: 5