У меня есть компонент, который использует простой модуль pub / sub, который я написал как очередь сообщений. Я хотел бы попробовать другие реализации, такие как RabbitMQ. Тем не менее, я хочу, чтобы это изменение бэкэнда было настраиваемым, чтобы я мог переключаться между моей реализацией и сторонними модулями для обеспечения чистоты и тестирования.
Очевидный ответ:
- Считать файл конфигурации
- Создание объекта изменяемых настроек / dict
- Измените целевой компонент, чтобы лениво загрузить указанную реализацию.
что-то вроде:
# component.py
from test.queues import Queue
class Component:
def __init__(self, Queue=Queue):
self.queue = Queue()
def publish(self, message):
self.queue.publish(message)
# queues.py
import test.settings as settings
def Queue(*args, **kwargs):
klass = settings.get('queue')
return klass(*args, **kwargs)
Не уверен, что init должен принимать класс Queue, я думаю, это поможет легко определить очередь, используемую при тестировании.
Еще одна мысль, которая у меня была, была что-то вроде http://www.voidspace.org.uk/python/mock/patch.html, хотя, похоже, что это станет грязным. Достоинством было бы то, что мне не пришлось бы изменять код для поддержки замены компонента.
Любые другие идеи или анекдоты приветствуются.
РЕДАКТИРОВАТЬ: Исправлен отступ.