2016-02-12 4 views
2

Использование Django 1.7 и Python 2.7.Как проверить send_mail в Django?

Я хочу проверить, отправлено ли письмо, и если содержимое почты верное.

Я пробовал использовать outbox из django.core.mail, но безрезультатно. Также я могу просто получить stdout (поскольку я могу видеть почту в консоли, когда я запускаю свои тесты)?

models.py

class User(AbstractBaseUser, PermissionsMixin): 
    USERNAME_FIELD = 'email' 

    email = models.EmailField(max_length=255, unique=True) 
    is_staff = models.BooleanField(default=False) 
    org = models.ForeignKey('Org', null=True, blank=True, 
     on_delete=models.SET_NULL) 

    def __unicode__(self): 
     return self.email 

    @staticmethod 
    def send_password_token(email): 
     user = get_object_or_404(User, email=email) 
     token = Token.objects.get(user=user) 
     message_body = 'Your password reset token:\n\n\t%s' % token.key 
     send_mail('Password reset:', message_body, 
      settings.FROM_EMAIL, [email], fail_silently=False) 

tests.py

class UserModelTest(TestCase): 
    def setUp(self): 
     self.user = User.objects.create_user(email='[email protected]', 
      password='0000') 

    @override_settings(EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend') 
    def test_send_password_token(self): 
     """ 
     Sends a password reset mail with users authentication token. 
     """ 
     token = Token.objects.get(user=self.user) 
     User.send_password_token(self.user.email) 
+4

Вы видели [пример в документации] (https://docs.djangoproject.com/en/1.9/topics/testing/tools/#email-services)? Вы должны удалить декоратор 'override_settings'. Затем Django автоматически будет использовать брандмауэр электронной почты 'locmem' и отправит электронное письмо в папку« Исходящие »для проверки. – Alasdair

+0

Когда вы используете консольную консоль, письма будут отправляться только на stdout и не будут доступны из почтового ящика django.core.mail. Используйте базу данных locmem. https://docs.djangoproject.com/en/1.9/topics/email/#in-memory-backend –

ответ

5

Спасибо за @Alasdair для решения. Оказывается, это было довольно просто. Просто удалите override_settings и импортируйте outbox.

tests.py

from django.core.mail import outbox 

class UserModelTest(TestCase): 
    def setUp(self): 
     self.user = User.objects.create_user(email='[email protected]', 
      password='0000') 

    def test_send_password_token(self): 
     """ 
     Sends a password reset mail with users authentication token. 
     """ 
     token = Token.objects.get(user=self.user) 
     User.send_password_token(self.user.email) 
     self.assertEqual(len(outbox), 1) 
     self.assertEqual(outbox[0].subject, 'Password reset:') 
     self.assertEqual(outbox[0].from_email, <insert_from_email>) 
     self.assertEqual(outbox[0].to, [<insert_list_of_to_emails>]) 
     self.assertEqual(outbox[0].body, 
      'Your password reset token:\n\n\t%s' % token.key) 
+0

Возможно, это изменилось в Django 2 - теперь импорт кажется «из django.core import mail» и Исходный код проверяется как 'mail.outbox' –

Смежные вопросы