Обновление получателя bcc в бэкенде электронной почты
Я создаю почтовый бэкенд, который должен добавить определенный адрес в bcc письма.
from django.conf import settings
from djcelery_email.backends import CeleryEmailBackend
class BCCEmailBackend(CeleryEmailBackend):
def send_messages(self, email_messages):
for i, message in enumerate(email_messages):
if settings.DEFAULT_BCC_EMAIL is not None:
message.bcc.append(settings.DEFAULT_BCC_EMAIL)
super().send_messages(email_messages)
Когда я запускаю свой тест, bcc не устанавливается.
@override_settings(DEFAULT_BCC_EMAIL="should_be_send@bcc.de")
def test_default_bcc_email(self):
self.assertEqual(settings.DEFAULT_BCC_EMAIL, "should_be_send@bcc.de")
msg = EmailMultiAlternatives(
self.subject, self.text_content, "test@sender.de", ["test@recipient.de"]
)
msg.attach_alternative(self.html_content, "text/html")
msg.send()
#...
# This test always fails
self.assertListEqual(m.bcc, ["should_be_send@bcc.de"], "Default bcc should be set")
Когда я устанавливаю bcc непосредственно при инициализации EmailMultiAlternatives, мой тест проходит успешно.
Это документированное поведение в том, что касается тестов:
Тестовый бегунок Django автоматически перенаправляет все отправленные Django электронные письма в фиктивный почтовый ящик. Это позволяет вам тестировать все аспекты отправки электронной почты - от количества отправленных сообщений до содержимого каждого сообщения - без фактической отправки сообщений
.Бегунок тестирования достигает этого путем прозрачной замены обычного бэкенда электронной почты на бэкенд тестирования.
Итак, ваш пользовательский бэкенд никогда не используется в вашем тесте, поэтому он и не работает. Я думаю, что самый простой способ решить эту проблему - написать тест по-другому, чтобы напрямую вызывать метод send_messages() в вашем классе, например:
msg = EmailMultiAlternatives(
self.subject, self.text_content, "test@sender.de", ["test@recipient.de"])
# Note, you may have to mock out some behaviour of the backend to
# ensure it doesn't actually send an email.
BCCEmailBackend().send_messages([msg])
# This should pass now
self.assertListEqual(msg.bcc, ["should_be_send@bcc.de"], "Default bcc should be set")