Выбор ответа 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) поднимаются над импортами, чтобы мок подменил модуль до его загрузки.

Варианты ответа

  1. vi.fn нельзя присваивать константе, мок должен быть объявлен через let
  2. В Vitest нельзя мокать модули, это работает лишь в Jest
  3. Нужно сначала импортировать модуль, а потом вызвать vi.mock для него
  4. vi.mock поднимается выше объявления sendMock, фабрика идёт раньшеправильный ответ

Разбор

Вызовы vi.mock (как и jest.mock) поднимаются над импортами, чтобы мок подменил модуль до его загрузки. Переменная, объявленная ниже, в момент вызова фабрики ещё не инициализирована. Решение в Vitest: vi.hoisted(() => ({ sendMock: vi.fn() })) или создавать мок внутри фабрики.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.