I’m getting the error:
ReferenceError: Cannot access 'myMock' before initialization
Even though i respected jest documentation about the hoisting:
A limitation with the factory parameter is that, since calls to jest.mock() are hoisted to the top of the file, it's not possible to first define a variable and then use it in the factory. An exception is made for variables that start with the word 'mock'.
I’m doing this:
import MyClass from './my_class'; import * as anotherClass from './another_class'; const mockMethod1 = jest.fn(); const mockMethod2 = jest.fn(); jest.mock('./my_class', () => { return { default: { staticMethod: jest.fn().mockReturnValue( { method1: mockMethod1, method2: mockMethod2, }) } } });
as you can see both of my variables respect the “standard” but are not hoisted properly.
Am I missing something ?
Obviously it works when I just pass jest.fn()
instead of my variables, but i’m not sure how to be able to use these in my test later on.
Advertisement
Answer
The accepted answer does not handle when you need to spy on the const
declaration, as it is defined inside the module factory scope.
For me, the module factory needs to be above any import statement that eventually imports the thing you want to mock. Here is a code snippet using a nestjs with prisma library.
// app.e2e.spec.ts import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; import * as request from 'supertest'; import mockPrismaClient from './utils/mockPrismaClient'; // you can assert, spy, etc. on this object in your test suites. // must define this above the `AppModule` import, otherwise the ReferenceError is raised. jest.mock('@prisma/client', () => { return { PrismaClient: jest.fn().mockImplementation(() => mockPrismaClient), }; }); import { AppModule } from './../src/app.module'; // somwhere here, the prisma is imported describe('AppController (e2e)', () => { let app: INestApplication; beforeEach(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [AppModule], }).compile(); app = moduleFixture.createNestApplication(); await app.init(); }); )};