Тестовая среда Django с файловым почтовым сервером

Я сформулировал контрольные примеры в рамках Django.

Вариант использования: я использую API, который регистрирует пользователя, отправляя ему электронное письмо, и когда они нажимают на ссылку, указанную в электронном письме, их учетная запись активируется.

В моих settings.py я использую

EMAIL_FILE_PATH  ='django.core.mail.backends.filebased.EmailBackend'

который указывает на локальный каталог.

При запуске тестового примера PyUnit из eclipse все работает файл. Текстовый файл генерируется для каждого отправленного электронного письма

Но когда я использую

python ./manage.py test <component_name>

файлы не генерирует.

Любое понимание, в чем разница, когда я выполняю контрольный пример с ./manage.py и когда я использую pyUnit?

3 ответа

Решение

Простой ответ:

Вы не можете сделать это без разработки собственной почтовой системы, но это, вероятно, было бы глупо. Я бы предложил сделать что-то еще, чтобы убедиться, что код был успешным, не требуя отправки электронного письма. Например, запустите код, предположите, что пользователь щелкает ссылку, и создайте RequestFactory, чтобы получить / опубликовать ссылку для запуска кода представления, связанного с ней.

Из приложения тестирования Django:

Услуги электронной почты

"If any of your Django views send email using Django's email functionality,
you probably don't want to send email each time you run a test using that
view. For this reason, Django's test runner automatically redirects all
Django-sent email to a dummy outbox. This lets you test every aspect of
sending email -- from the number of messages sent to the contents of each
message -- without actually sending the messages."

Можно перезаписать этот аспект в Django, если вы хотите использовать определенный почтовый бэкэнд.

В django.test.utils Django изменит бэкэнд электронной почты на locmem, как указано в документации по тестированию Django, когда Django устанавливает среду тестирования:

def setup_test_environment():
...
    mail.original_email_backend = settings.EMAIL_BACKEND
    settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'

Поэтому, если вы хотите включить отправку электронной почты для теста, вам просто нужно изменить настройку на то, что вы хотите.

from django.test.utils import override_settings

@override_settings(EMAIL_BACKEND='django.core.mail.backends.filebased.EmailBackend')
class MyTest(TestCase):
    # your test case

Для кого-то ( например, меня), которому необходимо использовать настраиваемый сервер электронной почты для всех тестов, другим решением будет переопределить класс TestRunner и принудительно изменить настройки.

      from django.conf import settings
from django.test.runner import DiscoverRunner


class CustomTestRunner(DiscoverRunner):
    def setup_test_environment(self, **kwargs):
        super().setup_test_environment(**kwargs)
        settings.EMAIL_BACKEND = 'path.to.your.email.backend'

И после этого прописать в настройках бегун тестов:

      TEST_RUNNER = 'path.to.CustomTestRunner'
Другие вопросы по тегам