Как разрешить переключение на (nullable) инфраструктурные заглушки в Django

Вопрос - Какой подход или паттерн проектирования позволит легко использовать в Django заглушки для внешних интеграций при выполнении тестов? Под "внешними интеграциями" я подразумеваю пару внешних REST API, и файловую систему NAS. Внешние интеграции уже являются отдельными модулями/классами.

Что я делаю сейчас - В настоящее время я отключаю внешние зависимости в тестах, в основном рассыпая утверждения mock.path() по всему тестовому коду. Но это становится непрактичным (нужно применять каждый тест; также легко забыть, особенно в высокоуровневых тестах), и слишком много связано с внутренним устройством некоторых модулей.

Некоторые детали того, что я ищу

Мне нравится концепция "обнуляемой инфраструктуры", описанная на сайте https://www.jamesshore.com/v2/blog/2018/testing-without-mocks#nullable-infrastructure.

Я особенно ищу подход, который хорошо интегрируется с Django, т.е. учитывая подход settings.py к файлам, и запуск тестов через python manage.py test. Я хотел бы иметь возможность легко:

  • заявить, что все тесты должны использовать нуллифицируемый аналог класса или функции инфраструктуры
  • .
  • переопределять это поведение для каждого теста или класса теста, когда это необходимо (например, при тестировании реальной внешней инфраструктуры).
  • .

Я попробовал подход, описанный в https://medium.com/analytics-vidhya/mocking-external-apis-in-django-4a2b1c9e3025, где в основном говорится о создании реализации интерфейса, реальной реализации и реализации-заглушки. Переключение осуществляется с помощью декоратора класса. Но это не очень хорошо работает: декоратор классов в моей установке не работает с @override_settings (декоратор применяет настройки при запуске django, а не при выполнении теста), и там действительно много лишнего кода (который также кажется непитоническим).

Вернуться на верх