Context
Функциональность Jest "auto mocking" очень полезна. Мне не нужно создавать рукописные макеты для каждого класса, я могу просто сделать:
jest.mock('./src/MyObject')
... и у меня есть фиктивный объект, который имеет все нужные функции, все вычеркнуты.
Обратите внимание, что я не обращаюсь к функции "автомок", которая переносит это на другой уровень, даже не требуя от вас вызова jest.mock()
, а скорее к автоматическим функциям, которые возникают, когда вы вызываете jest.mock()
без прохождения имитации фабрика (т.е. когда передается только один аргумент).
Цель
Я хочу иметь возможность немного настроить это автоматическое поведение насмешки, не теряя при этом магию, описанную выше. Для контекста я пытаюсь заставить Jest хорошо играть со сторонними фреймворками, но вот некоторые упрощенные требования:
- Замена вставки. Вы все еще звоните
jest.mock()
, вы все еще импортируете
классы обычно и т. д. Авторы тестов не обращают внимания на
настройки.
- Все функции целевого объекта еще
автоматически высмеивается. Если я добавлю функции к этому объекту, мне не нужно
обновить макет.
- Если целевой объект имеет функцию с именем
awesomeFunction()
, я хочу, чтобы он автоматически подвергался насмешке, возвращая строку «awesome». (надуманный пример оповещения!)
Где я застрял
Мне удалось создать функцию, которая использует jest.genMockFromModule()
, которая вызывает это автоматическое поведение насмешки. Затем я могу изменить эту макет по своему усмотрению (например, насмешка awesomeFunction()
). Наконец я могу зарегистрировать этот макет используя jest.setMock()
.
Теперь я могу использовать эту функцию (назовем ее mockAwesomely()
) в моем тестовом коде:
import MyModule from './src/MyModule'
mockAwesomely('./src/MyModule') // used to be jest.mock('./src/MyModule')
Проблема в том, что с этим кодом импортированный MyModule
не является проверенным модулем. Это настоящий MyModule
. После некоторого расследования я считаю, что это происходит, потому что mockAwesomely()
не поднимается в начало файла, как jest.mock()
. Даже ручное размещение его в верхней части файла, похоже, не работает, потому что import
операторы тоже подняты.
Я чувствую, что я действительно близко. Любые предложения о том, как продолжить?