Тестовая среда 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'