Обновление получателя 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")
Вернуться на верх