12

私のsettings.pyに、私は入れました:

EMAIL_BACKEND = 'mailer.backend.DbBackend'

そのため、 からインポートする場合でもfrom django.core.mail import send_mailsend_mail関数は電子メールをすぐに送信するのではなく、データベースのキューに入れます。

実際に Web サイトを実行しているときは問題なく動作しますが、Web サイトをテストし、電子メールをトリガーするいくつかの Web ページにアクセスすると、電子メールはキューに入れられなくなりました。

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
    ...

テスト中にバックエンドを使用していないように見えるのはなぜですか? (それ自体send_mailからのインポートmailerはテストに合格しますが、のような他のメーリングアプリのインポートを実際に変更することはできませんdjango-templated-email

4

4 に答える 4

31

この質問によると、django はsetting.EMAIL_BACKENDwhen testing を にオーバーライドします'django.core.mail.backends.locmem.EmailBackend'こちらのdjangoドキュメントにもあります。

于 2013-04-26T12:15:59.563 に答える
5

django-mailer でメールを適切にテストするには、2 つの設定をオーバーライドする必要があります。

  1. django-mailer バックエンドを使用するためのテストを行う
  2. テスト バックエンドを使用するように djano-mailer バックエンドを作成します。

django-mailer バックエンド (番号 2) を設定しない場合、テストは実際にメールを送信しようとします。

また、正しいメールの mail.outbox をチェックできるように、django-mailer の send_mail 管理コマンドの実行をシミュレートする必要があります。

テスト メソッドをセットアップする方法の例を次に示します。

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 によるデフォルトのテスト メール バックエンド セットアップを使用します。

于 2014-09-25T15:28:21.110 に答える