#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()
(отключение правил крючков).