简体   繁体   English

如何在Django中测试send_mail?

[英]How to test send_mail in Django?

Using Django 1.7 and Python 2.7. 使用Django 1.7和Python 2.7。

I want to test if the mail was sent and if the content of the mail is correct. 我想测试邮件是否已发送以及邮件内容是否正确。

I've tried using outbox from django.core.mail, but to no avail. 我尝试过使用django.core.mail中的outbox,但无济于事。 Also could I just get the stdout (since I can see the mail in the console when I run my tests)? 我也可以获得stdout(因为我在运行测试时可以在控制台中看到邮件)?

models.py 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 tests.py

class UserModelTest(TestCase):
    def setUp(self):
        self.user = User.objects.create_user(email='user@info.com',
            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)

Thanks for @Alasdair for the solution. 感谢@Alasdair提供的解决方案。 Turns out it was quite simple. 事实证明这很简单。 Just remove override_settings and import outbox. 只需删除override_settings并导入发件箱即可。

tests.py tests.py

from django.core.mail import outbox

class UserModelTest(TestCase):
    def setUp(self):
        self.user = User.objects.create_user(email='user@info.com',
            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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM