Расширение функциональности Jest "Automatic Mock" - PullRequest
0 голосов
/ 14 сентября 2018

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 операторы тоже подняты.

Я чувствую, что я действительно близко. Любые предложения о том, как продолжить?

...