Выбор ответа Senior Jest и Vitest обновлено
Поднятие vi.mock
Вопрос
Почему такой код падает с ошибкой обращения к sendMock до инициализации?
import { vi } from 'vitest';
import { notify } from './notify';
const sendMock = vi.fn();
vi.mock('./mailer', () => ({ send: sendMock }));
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: vi.mock поднимается выше объявления sendMock, фабрика идёт раньше. Вызовы vi.mock (как и jest.mock) поднимаются над импортами, чтобы мок подменил модуль до его загрузки.
Варианты ответа
vi.fnнельзя присваивать константе, мок должен быть объявлен черезlet- В Vitest нельзя мокать модули, это работает лишь в Jest
- Нужно сначала импортировать модуль, а потом вызвать
vi.mockдля него vi.mockподнимается выше объявленияsendMock, фабрика идёт раньшеправильный ответ
Разбор
Вызовы vi.mock (как и jest.mock) поднимаются над импортами, чтобы мок подменил модуль до его загрузки. Переменная, объявленная ниже, в момент вызова фабрики ещё не инициализирована. Решение в Vitest: vi.hoisted(() => ({ sendMock: vi.fn() })) или создавать мок внутри фабрики.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.