Я пытаюсь создать больше разделения проблем с конечными точками в моих приложениях Django, но не знаю, как реализовать сервисный уровень.Я прочитал популярную статью по питону на эту тему, но она не отвечает на вопросы тестирования.
Например, если у меня есть запрос на сохранение пользователя и я хочу отправить электронное письмо после того, как пользователь был сохранен, популярно обрабатывать эту логику, переопределяя сохранение следующим образом:
**models.py**
class User(AbstractBaseUser, PermissionsMixin):
...
def save(self, *args, **kwargs):
if self._state.adding:
user.activate_user(user=self)
super(User, self).save(*args, **kwargs)
**services.py**
from services import iNotificationService
...
def activate_user(user):
user.active = True
iNotificationService().send_message(user)
В приведенном выше примере iNotificationService будет интерфейсом, который приложение может выбрать во время выполнения.Если бы этот пользователь был сохранен в производственной среде, приложение предоставило бы класс, подобный следующему
import mandrill
class EmailClient(iNotificationService)
def send_message(user):
message = create_message(user)
mandrill.send_email(message)
, в модуль services.py для отправки электронного письма.Но если бы приложение запускалось в тестовой среде, то при проверке EmailClient тест выполнялся путем отправки экземпляра интерфейса, чтобы электронная почта не отправлялась:
class iNotificationService(object)
def send_message(user)
pass
Мне интересно, какЯ предоставляю экземпляр модулю services.py, чтобы activ_user знал, какой тип уведомления отправлять.Моя единственная идея была в том, чтобы передать аргумент методу save, чтобы он знал, какой тип уведомления использовать.Но мне интересно, насколько масштабируемым было бы это решение, учитывая различные места, в которых можно использовать службу.