1

我在 Django 1.4 中有一个简单的函数,可以发送邮件。这被放在一个 try/except 中,以防邮件服务可能关闭(这是一个外部依赖项)。

现在,我想测试这个异常。我认为这很简单,通过覆盖一些电子邮件设置(如 settings.EMAIL_HOST 或 settings.EMAIL_BACKEND),但即使后端配置了乱码,Django 测试框架也不会导致 send_mail() 抛出错误......

所以问题是:如何让 send_mail() 在我的测试用例中抛出错误?

谢谢!


回答:

import mock
class MyTestCase(TestCase):
    @mock.patch('path.to.your.project.views.send_mail', mock.Mock(side_effect=Exception('Boom!')))
    def test_changed_send_mail(self):
4

4 回答 4

0

是的,测试套件不设置电子邮件系统。不幸的是,我不知道有什么方法可以测试电子邮件系统。

您不应该真正测试 send_mail 函数,因为它是内置的。也就是说,您可以验证通过另一个函数传递到 send_mail 的数据。如果您知道预期输入的域,您可以验证并抛出(引发)您自己的异常。

于 2012-11-21T19:36:11.543 回答
0

https://docs.djangoproject.com/en/1.4/topics/email/#the-emailmessage-class

这是发送电子邮件的更 django'y 方式:

# attempt to send out a welcome email
try :
    t = loader.get_template('email_templates/membership/register.html')
    c = Context({
        'user'  : user,
        'site'  : Site.objects.get(id=settings.SITE_ID)
    })

    msg = EmailMessage('Welcome to Site', t.render(c), settings.EMAIL_HOST_USER, to=[user.email,])
    msg.content_subtype = "html"
    msg.send()
except :
    messages.info(request, _(u'Our email servers are encountering technical issues, you may not recieve a welcome email.'))

在我的 settings.py 中:

import os
EMAIL_HOST_USER = os.environ['SENDGRID_USERNAME']
EMAIL_HOST= 'smtp.sendgrid.net'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_PASSWORD = os.environ['SENDGRID_PASSWORD']

注意:SENDGRID_USERNAME 和 SENDGRID_PASSWORD 是由 heroku 插件添加为环境变量的,您可能在设置文件中嵌入了实际凭据,这很好。

那么为什么您的电子邮件没有抛出异常?https://docs.djangoproject.com/en/1.4/topics/email/#django.core.mail.get_connection

fail_silently 参数控制后端应如何处理错误。如果 fail_silently 为 True,则电子邮件发送过程中的异常将被静默忽略。

于 2012-11-21T19:38:38.950 回答
0

我不是测试专家,但我认为您应该使用 send_mail 模拟来引发您要测试的异常。

可能你可以看看这个 stackoverflow question来了解更多关于在 Django 中模拟的信息。

于 2012-11-21T19:40:02.300 回答
0

http://www.voidspace.org.uk/python/mock/patch.html#where-to-patch上的补丁文档详细解释了如何进行此操作。

我注意到答案确实在问题中,但为了帮助其他人了解问题所在,上面的链接将被证明是非常有见地的。

如果要修补 class 中的对象引用b.py,请确保您的修补调用模拟对象引用,b.py而不是a.py从导入对象的位置。对于习惯于将函数作为一等公民的整个想法的 Java 开发人员来说,这可能是一个绊脚石。

于 2014-09-29T10:06:41.307 回答