5

私はpythonとアプリエンジンの初心者です。

いくつかの認証ロジックの後にリクエストパラメーターに基づいて電子メールを送信するこのコードがあります。単体テスト (私はGAEUnitを使用しています) で、特定の内容のメールが送信されたことを確認するにはどうすればよいですか? - つまり、send が呼び出されたことを確認するために、偽のメーラーでメーラーをモックするにはどうすればよいですか?

class EmailHandler(webapp.RequestHandler):
 def bad_input(self):
  self.response.set_status(400)
  self.response.headers['Content-Type'] = 'text/plain'
  self.response.out.write("<html><body>bad input </body></html>")

 def get(self):
  to_addr = self.request.get("to")
  subj = self.request.get("subject")
  msg = self.request.get("body")
  if not mail.is_email_valid(to_addr):
    # Return an error message...
    #   self.bad_input()
    pass

  # authenticate here

  message = mail.EmailMessage()
  message.sender = "my.company@gmail.com"
  message.to = to_addr
  message.subject = subj
  message.body = msg
  message.send()
  self.response.headers['Content-Type'] = 'text/plain'
  self.response.out.write("<html><body>success!</body></html>")

そして単体テスト、

import unittest
from webtest import TestApp
from google.appengine.ext import webapp
from email import EmailHandler

class SendingEmails(unittest.TestCase):

  def setUp(self):
    self.application = webapp.WSGIApplication([('/', EmailHandler)], debug=True)

  def test_success(self):
    app = TestApp(self.application)
    response = app.get('http://localhost:8080/send?to=vijay.santhanam@gmail.com&body=blah_blah_blah&subject=mySubject')
    self.assertEqual('200 OK', response.status)
    self.assertTrue('success' in response)
    # somehow, assert email was sent 
4

5 に答える 5

3

AppEngine 内_GenerateLogでメソッドをオーバーライドすることもできます。mail_stub

電子メールが送信されることをテストするときに mixin として使用する親 TestCase クラスを次に示します。

from google.appengine.api import apiproxy_stub_map, mail_stub

__all__ = ['MailTestCase']

class MailTestCase(object):
    def setUp(self):
        super(MailTestCase, self).setUp()
        self.set_mail_stub()
        self.clear_sent_messages()

    def set_mail_stub(self):
        test_case = self
        class MailStub(mail_stub.MailServiceStub):
            def _GenerateLog(self, method, message, log, *args, **kwargs):
                test_case._sent_messages.append(message)
                return super(MailStub, self)._GenerateLog(method, message, log, *args, **kwargs)

        if 'mail' in apiproxy_stub_map.apiproxy._APIProxyStubMap__stub_map:
            del apiproxy_stub_map.apiproxy._APIProxyStubMap__stub_map['mail']

        apiproxy_stub_map.apiproxy.RegisterStub('mail', MailStub())

    def clear_sent_messages(self):
        self._sent_messages = []

    def get_sent_messages(self):
        return self._sent_messages

    def assertEmailSent(self, to=None, sender=None, subject=None, body=None):
        for message in self.get_sent_messages():
            if to and to not in message.to_list(): continue
            if sender and sender != message.sender(): continue
            if subject and subject != message.subject(): continue
            if body and body not in message.textbody(): continue
            return

        failure_message = "Expected e-mail message sent."

        args = []
        if to: args.append('To: %s' % to)
        if sender: args.append('From: %s' % sender)
        if subject: args.append('Subject: %s' % subject)
        if body: args.append('Body (contains): %s' % body)

        if args:
            failure_message += ' Arguments expected: ' + ', '.join(args)

        self.fail(failure_message)

その後、サンプル テスト ケースは次のようになります。

import unittest, MailTestCase

class MyTestCase(unittest.TestCase, MailTestCase):
    def test_email_sent(self):
        send_email_to('test@example.org') # Some method that would send an e-mail.
        self.assertEmailSent(to='test@example.org')
        self.assertEqual(len(self.get_sent_messages()), 1)
于 2009-09-11T15:50:57.847 に答える
2

以下を使用して、メール スタブを有効にしてから送信されたすべてのメッセージを取得します。

from google.appengine.api import apiproxy_stub_map
sent_messages = apiproxy_stub_map.apiproxy._APIProxyStubMap__stub_map['mail'].get_sent_messages()
于 2011-09-28T06:34:36.627 に答える
2

Google のドキュメントには、これを行うための非常に簡単な方法があります。

次のように、セットアップでテストベッドとメール スタブを作成します。

self.testbed = testbed.Testbed()
self.testbed.activate()
self.testbed.init_mail_stub()
self.mail_stub = self.testbed.get_stub(testbed.MAIL_SERVICE_NAME)

メソッドを実行し、次のように確認します。

 messages = self.mail_stub.get_sent_messages(to='alice@example.com')
 self.assertEqual(1, len(messages))
 self.assertEqual('alice@example.com', messages[0].to)
于 2015-09-10T21:24:47.170 に答える
2

非常に短い紹介でPyPI: MiniMock 1.0が提供されます。モックを作成するための非常に小さなライブラリです。

  1. モックする必要があるモジュールにモックを挿入します
  2. モックが返すものを定義する
  3. メソッドを呼び出す
  4. あなたのモックは、どのメソッドが呼び出されたかを示します。

幸運を!

于 2009-01-09T08:46:09.517 に答える
1

GAEUnit で jgeewax の GAE Testbed を使用しました。NoseGAE の代わりに GAEUnit を使用する方が簡単でした。なぜなら、私は既に GAEUnit を配置していたからです。手順は次のとおりです。

GAEUnit をアプリに追加する

  1. GAEUnit の zip アーカイブをGoogle Code プロジェクト ホスティング ページからダウンロードします。
  2. アーカイブを抽出します。
  3. アーカイブから抽出したフォルダーから、gaeunit.pyアプリのルート フォルダーにコピーします。
  4. app.yaml次の 2 行を、次の行のすぐ下に追加しますhandlers:

コード:

- url: /test.*
  script: gaeunit.py

(オプション) アーカイブから抽出されたフォルダーから、という名前のフォルダーがsample_appあり、その中にモジュールの変更されたバージョンがありwebtestます。webtestモジュール (debugapp.pyとを含むフォルダー全体__init__.py) をアプリのルートにコピーします。

GAE Testbed を GAEUnit に追加します。

  1. GAE Testbed の tar gzip アーカイブをGoogle Code プロジェクト ホスティング ページからダウンロードします。
  2. アーカイブを抽出します。
  3. 解凍したアーカイブの中にgaetestbedモジュールがあります (「gaetestbed」という名前のフォルダーです)。モジュールをアプリのルートにコピーします。
  4. アプリのルートの test フォルダー内にファイルを作成します。この例のために、名前を付けましょうtest_mailer.py
  5. GAE Testbed Google Code プロジェクト ホスティング ページの例を使用して、次の行を に追加しますtest_mailer.py

コード:

import unittest
from gaetestbed import MailTestCase

class MyTestCase(MailTestCase, unittest.TestCase):
    def test_email_sent(self):
        send_email_to('test@example.org') # Some method that sends e-mail...
        self.assertEmailSent(to='test@example.org')
        self.assertEqual(len(self.get_sent_messages()), 1)

サーバーを起動し、 に移動しhttp://localhost:8080/testます。(追加の) 1/1 テストが から実行されたことに注意してくださいhttp://localhost:8080/test

出典: GAEUnit で GAE Testbed を使用: メールが送信されたことをテストする

于 2010-04-04T19:33:07.617 に答える