1

Django 1.4 には、メールが送信される単純な関数があります。これは、メーリング サービスがダウンしている可能性がある場合 (外部依存関係) に備えて、try/except に入れられます。

ここで、この例外をテストしたいと思います。いくつかの電子メール設定 (settings.EMAIL_HOST や settings.EMAIL_BACKEND など) をオーバーライドすることで、これは簡単だと思いましたが、Django テスト フレームワークでは、バックエンドが jibberish で構成されていても 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

Yes, the test suite does not set up the email system. Unfortunately, I don't know of any way t o test the email system.

You shouldn't really be testing send_mail functions as it is a built in. That said, you can validate the data being passed into send_mail by another function. If you know the domain of expected inputs, you can verify and throw (raise) an exception of your own.

于 2012-11-21T19:36:11.543 に答える
0

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

これは、電子メールを送信するためのよりジャンゴ的な方法です。

# 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 モックを使用する必要があると思います。

おそらく、このスタックオーバーフローの質問を見て、Django でのモックについて詳しく知ることができます。

于 2012-11-21T19:40:02.300 に答える