Повторное использование насмешек модуля Jest в тестах

#jestjs #mocking #next.js #es6-modules

Вопрос:

Я хочу смоделировать модуль для теста. Все работает, но мне приходится копировать/вставлять один и тот же код в каждый тестовый файл. Как я могу сделать это более удобным для обслуживания?

(Это использование Вавилона и машинописного текста в Next.js проект.)

Производственный код выглядит следующим образом:

 import { useRouter } from 'next/router';

// Then call the hook in a React component:
  const router = useRouter();
 

Тестовый код:

 // I need to access these mocks in the tests
const mockRouterPush = jest.fn();
const mockRouterBack = jest.fn();

jest.mock('next/router', () => ({
  useRouter: () => ({
    push: mockRouterPush,
    query: { segment: 'seg1' },
    back: mockRouterBack,
  }),
}));
 

Это прекрасно работает. Модуль и его крюк высмеиваются для тестового файла, и я могу ссылаться на насмешки в тестах. Проблема в том, что его трудно поддерживать в нескольких тестовых файлах.

Вызовы jest.mock() помещаются в верхнюю часть файла и могут ссылаться только на переменные, начинающиеся со слова «mock».

С другими насмешками, которые я использовал require на фабрике модулей вместо import ; это работает и уменьшает шаблонность, но (а) затрудняет для тестов ссылку на насмешки и (б) моя среда IDE (VSCode) не будет автоматически обновлять пути, как это происходит с импортом при перемещении файлов. Например:

 jest.mock('react-i18next', () => {
  // Sometimes the path is '../../../testhelpers' etc.
  const { mockUseTranslation } = require('./testhelpers');

  return {
    useTranslation: mockUseTranslation,
  };
});
 

Я пытался doMock , createMockFromModule но безуспешно.

Как другие люди решают эту проблему?

Ответ №1:

Возможно, использование __mock__ каталога может вам помочь.

из документов:

Ручные насмешки определяются путем записи модуля в подкаталоге mocks/ , непосредственно примыкающем к модулю. Например, чтобы создать макет модуля с именем user в каталоге models, создайте файл с именем user.js и поместите его в каталог models/mocks.

Вы также можете создавать макеты модулей из node_modules каталога.

Ручные Издевки

Комментарии:

1. Спасибо! Коллега тоже упомянул об этом, и я только что успешно попробовал. Гнездовые работы: __mocks__/next/router.js Затем просто jest.mock('next/router') для доступа к насмешкам, которые я могу делать import { useRouter } from 'next/router' в тестах, затем const { push: mockRouterPush } = useRouter() (отключение правил крючков).