2016-10-20 14 views
1

カスタムDjango電子メールバックエンドのunittestを作成し、それを「本当の」smtpサーバに対してテストしようとしていますが、Pythonの組み込みsmtpdデバッグを使用しようとしています。実行して、サーバー:Python smtpデバッグサーバから出力をキャプチャする方法

python -m smtpd -n -c DebuggingServer localhost:1025 

私のユニットテストは、基本的に次のようになります。

class Tests(TestCase): 

    @override_settings(EMAIL_BACKEND='mycustombackend') 
    @override_settings(EMAIL_HOST='localhost') 
    @override_settings(EMAIL_PORT='1025') 
    def test_backend(self): 
     from django.core import mail 
     mail.send_mail(
       subject='Subject here', 
       message='Here is the message.', 
       from_email='[email protected]', 
       recipient_list=['[email protected]'], 
       fail_silently=False, 
      ) 

と、私はこれを実行すると、smtpdのプロセスが正しく、電子メールの内容を出力します。

しかし、私はそれをキャプチャして私のユニットテストでそれを確認できるので、何も得られません。私はsubprocessパッケージを使用してプロセスを起動し、パイプ経由で出力を読み込もうとしましたが、出力を受け取ることはありません。

最後の手段として、私は、プロセスを起動しようとしたので、私は、私が間違ってサブプロセスを使用していたと思った:

python -m smtpd -n -c DebuggingServer localhost:1025 > /tmp/smtpd.log 

とログファイルを読み込みます。しかし、それでも出力はファイルに書き込まれません。

ここでは何が起こっていますか?

答えて

3

私は同じ問題を抱え、何が起こっているのか把握しようと2日を費やしました。私はsubprocessと私の統合テストのいずれかから両方

python -m smtpd -n -c DebuggingServer localhost:1025 

python -m smtpd -n -c DebuggingServer localhost:1025 > mail.log 

を実行しようとしたが、それはうまくいきませんでした。 REPLを通してそれを試している間に私はsubprocessによって開かれたパイプからの最初の読み取りがハングすることに気づいた。私はそれを殺すと、次の読み取りは実際にデータを返します。だから私はストリームにあるものを調べ始める。しかし、私は2時間で運がなかったので、SMTPServerの周りに自分自身のラッパーを巻くことになり、ファイルを書き、自分自身を稼働させました。

# test_smtpd.py 

import smtpd 

SMTP_DUMPFILE = '/tmp/mail.log' 

class SMTPTestServer(smtpd.SMTPServer): 
    def process_message(self, peer, mailfrom, rcpttos, data, **kwargs): 
     with open(SMTP_DUMPFILE, 'w') as f: 
      f.write(data) 

私は

python -m smtpd -n -c test_smtpd.SMTPTestServer localhost:1025 

でそれを実行します。ここでは

は、ラッパークラス( process_messagesmtpdモジュールによって実行可能であることを smtpd.SMTPServerの子クラスに要求される抽象メソッドである)でありますこれはあなたの質問に直接答えるわけではありませんが、簡単な回避策なので、これが役立つことを願っています。

0

this answerによれば、出力バッファリングがオンになっている。

stdbuf -oL python -m smtpd -n -c DebuggingServer localhost:1025 > mail.log 
:STDOUTが提案された解決策は、この場合であろう端末

以外にリダイレクトさ

プロセスを

関連する問題