Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
测试Django电子邮件后端_Django_Unit Testing_Testing_Django Mailer - Fatal编程技术网

测试Django电子邮件后端

测试Django电子邮件后端,django,unit-testing,testing,django-mailer,Django,Unit Testing,Testing,Django Mailer,在my settings.py中,我将: EMAIL_BACKEND = 'mailer.backend.DbBackend' 因此,即使从django.core.mail import send_mail导入时,send_mail功能仍会在数据库中对电子邮件进行排队,而不是立即发送 它在实际运行网站时工作正常,但在测试网站和访问一些触发电子邮件的网页时,电子邮件不再排队: def test_something(self): ... # Check no emails are

在my settings.py中,我将:

EMAIL_BACKEND = 'mailer.backend.DbBackend'
因此,即使从django.core.mail import send_mail导入
时,
send_mail
功能仍会在数据库中对电子邮件进行排队,而不是立即发送

它在实际运行网站时工作正常,但在测试网站和访问一些触发电子邮件的网页时,电子邮件不再排队:

def test_something(self):
    ...
    # Check no emails are actually sent yet
    self.assertEquals(len(mail.outbox), 0) # test fails here -- 2 != 0

    # Check queued emails.
    messages = Message.objects.all()
    self.assertEquals(messages.count(), 2) # test would also fail here -- 0 != 2
    ...

为什么它在测试时似乎没有使用后端?(从
mailer
本身导入
send\u mail
可以通过测试,但我无法真正更改其他邮件应用程序的导入,如
django模板电子邮件

根据此,当测试到
'django.core.mail.backends.locmem.EmailBackend'
时,django会覆盖
设置.EMAIL\u BACKEND
。它也在django文档中。

要使用django mailer正确测试电子邮件,您需要覆盖两个设置:

  • 进行测试以使用django mailer后端
  • 使djano mailer后端使用测试后端
  • 如果您没有设置django mailer后端(2号),您的测试将尝试真正发送电子邮件

    您还需要模拟运行django mailer的send_mail management命令,以便检查mail.outbox以获得正确的电子邮件

    以下是如何设置测试方法的示例:

    from mailer.engine import send_all
    
    @override_settings(EMAIL_BACKEND='mailer.backend.DbBackend')
    @override_settings(MAILER_EMAIL_BACKEND='django.core.mail.backends.locmem.EmailBackend')
    def test_email(self):
        # Code that generates email goes here.
    
        send_all()  # Simulates running django-mailer's send_mail management command.
    
        # Code to check the email in mail.outbox goes here.
    

    这种策略使您的测试特定于django mailer,而您并不总是想要或需要它。我个人只在测试django mailer启用的特定功能时使用此设置。否则,我将使用django的默认测试电子邮件后端设置。

    如果您确实希望在django测试中通过SMTP发送电子邮件(如默认),请使用decorator:

    from django.test.utils import override_settings    
    
    @override_settings(EMAIL_BACKEND='django.core.mail.backends.smtp.EmailBackend')
    class TestEmailVerification(TestCase):
       ...
    
    请尝试以下操作:

    django.core.mail.backends.console.EmailBackend
    

    @AlexanderAfanasiev是的,当使用
    runserver运行网站时,我已经让后端工作了;无论出于什么原因,在进行单元测试时,它都不起作用。非常感谢!!与七年前的文章中所阐述的相比,
    django.core.mail.backends.locmem.EmailBackend
    有什么好处?