Тестирование электронной почты в Django
Отправка сообщений электронной почты из веб-приложения часто кажется броском камней в черную дыру. Вы создаете сообщение, передаете его функции отправки почты и надеетесь на лучшее. Вы не контролируете почтовый ящик и почтовый сервер, поэтому весь этот процесс происходит где-то посередине, и вы надеетесь, что он просто работает.
Я думаю, пришло время изменить это. Сообщения электронной почты можно и нужно тестировать, как и любую другую часть веб-приложения. И, к счастью, Django делает этот процесс очень простым.
Чтобы отправить сообщение электронной почты в Django, вы можете использовать различные почтовые серверы: обычный SMTP-сервер, GMAIL или любой другой сервис, такой как mailgun или mailchimp.
Однако, когда мы запускаем тест, средство запуска тестов Django автоматически перенаправляет всю электронную почту, отправленную Django, в фиктивный исходящий ящик, что позволяет вам проверить каждый аспект отправки электронной почты — от количества отправленных сообщений до содержимого каждого сообщения.
Познакомьтесь с django.core.mail.outbox
Во время тестов каждое исходящее письмо вместо отправки во внешний мир сохраняется в django.core.mail.outbox
. Таким образом, мы получаем виртуальный почтовый ящик, который мы можем быстро проверить.
Например, вы можете проверить количество сообщений в поле:
from django.core import mail
print(len(mail.outbox))
Или вы можете получить электронное письмо и проверить его содержимое:
from django.core import mail
first_message = mail.outbox[0]
print(first_message.subject)
print(first_message.body)
Имея эти возможности, вы можете писать тесты, проверяющие содержимое и доставку электронной почты.
Вот краткий пример теста электронной почты, написанного для Pytest:
from django.core import mail
def test_send_mail():
# Use Django send_mail function to construct a message
# Note that you don't have to use this function at all.
# Any other way of sending an email in Django would work just fine.
mail.send_mail(
'Example subject here',
'Here is the message body.',
'from@example.com',
['to@example.com']
)
# Now you can test delivery and email contents
assert len(mail.outbox) == 1, "Inbox is not empty"
assert mail.outbox[0].subject == 'Subject here'
assert mail.outbox[0].body == 'Here is the message.'
assert mail.outbox[0].from_email == 'from@example.com'
assert mail.outbox[0].to == ['to@example.com']
Вот и все. Надеюсь, вы узнали что-то новое. Если да, пожалуйста, поделитесь этим постом как можно шире. Спасибо за поддержку!
Вернуться на верх