Photo by Dawin Rizzo on Unsplash
I faced with this issue when I tried to mock a module imported by my imported module.
So I was importing dependencyA
and dependencyA
was importing dependencyB
.
I tried to mock dependencyB
and faced with this issue.
Do not care about the names etc. This is the error I received.
// ❌ It throws an error "Reference Error: Cannot access 'depB' before initialization"
import { depA } from "./depA";
const myMock = jest.fn().mockReturnValueOnce(true);
jest.mock("../depB", () => ({
depB: myMock,
}));
This problem is only fixable by changing the location of import and jest.Mock
. It creates the problem, because when we import depA
and bring it to our module’s runtime, it already read all the dependencies of the depB
.
So Jest just locks it and doesn’t allow you to change.
Error message here is not really meaningful, but that’s how mostly things work in JS Universe 😄
// ✅ It passes without a problem
const myMock = jest.fn().mockReturnValueOnce(true);
jest.mock("../depB", () => ({
depB: myMock,
}));
import { depA } from "./depA";
A Special Warning
When I was wandering around the web, trying to solve this issue, I saw many people referencing a special warning in jest documentation
I immediately tried changing the naming of my variable from myMock
to mockMy
but it had 0 effect on me, it failed as previous
// ❌ It throws an error "Reference Error: Cannot access 'initRabbitMock' before initialization"
import { depA } from "./depA";
const mockMy = jest.fn().mockReturnValueOnce(true);
jest.mock("../depB", () => ({
depB: mockMy,
}));
So the only solution to this problem is actually changing the order of imports and mocks.