Я столкнулся с этой проблемой, когда пытался смоделировать модуль, импортированный моим импортированным модулем.

Итак, я импортировал dependencyA, а dependencyA импортировал dependencyB.

Я пытался издеваться над dependencyB и столкнулся с этой проблемой.

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

Эту проблему можно решить, только изменив расположение импорта и jest.Mock. Это создает проблему, потому что, когда мы импортируем depA и переносим его в среду выполнения нашего модуля, он уже считывает все зависимости файла depB.

Так что Jest просто блокирует его и не позволяет вам его изменить.
Сообщение об ошибке здесь не имеет особого смысла, но именно так все работает в JS Universe 😄

✅ It passes without a problem

const myMock = jest.fn().mockReturnValueOnce(true);
jest.mock('../depB', () => ({
  depB: myMock,
}));

import { depA } from './depA';

Особое предупреждение

Когда я бродил по сети, пытаясь решить эту проблему, я видел много людей, ссылающихся на специальное предупреждение в шутливой документации.

Я немедленно попытался изменить имя моей переменной с myMock на mockMy, но это не оказало на меня никакого влияния, оно не удалось, как и в предыдущем случае.

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

Таким образом, единственным решением этой проблемы является изменение порядка импорта и макетов.

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .