2009-01-09 28 views
5

ile Python alay e-posta gönderen ben python bir acemi ve uygulama motoru değilim.Birim test ve Google AppEngine

bazı yetkilendirme mantığı sonra istek parametreleri dayalı bir e-posta gönderir bu kodu var. Ünite testlerimde (GAEUnit kullanıyorum), belirli içeriklerin gönderildiği bir e-postayı nasıl doğrularım? - yani gönderenin doğrulandığını doğrulamak için e-posta göndericisini sahte bir e-postayla nasıl alayım?

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 = "[email protected]" 
    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>") 

Ve birim testleri

,

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/[email protected]&body=blah_blah_blah&subject=mySubject') 
    self.assertEqual('200 OK', response.status) 
    self.assertTrue('success' in response) 
    # somehow, assert email was sent 
+0

teşekkür ederiz. Böyle bir şey arıyordum. – sastanin

cevap

2

Çok kısa tanıtım PyPI: MiniMock 1.0 sağlar. Sahte olmanın çok küçük bir kütüphanesi.

  1. senin sahte
  2. Çağrısı çağrıldı yöntemi yöntemi
  3. Sizin sahte diyecekler dönecektir neyi
  4. tanımlayın alay edilmelidir modülün, içine alay enjekte edin.

İyi şanslar!

3

Ayrıca AppEngine'de iç mail_stub yılında _GenerateLog yöntemini geçersiz olabilir. İşte

bu e-postalar gönderilir test ederken bir mixin olarak kullanmak bir üst dizge sınıf geçerli:

import unittest, MailTestCase 

class MyTestCase(unittest.TestCase, MailTestCase): 
    def test_email_sent(self): 
     send_email_to('[email protected]') # Some method that would send an e-mail. 
     self.assertEmailSent(to='[email protected]') 
     self.assertEqual(len(self.get_sent_messages()), 1) 
+1

Sadece bunu yapan temel sınıflar veren http://gae-testbed.googlecode.com adresine bakın. –

+0

Bu proje umut verici görünüyor. Umarım öğreticileri zaten, özellikle de Posta API'sini test etmek için hazırlayabilirsiniz. – Randell

1

: Bundan sonra

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) 

, örnek bir test durumu gibi görünebilir GAEUnit ile jgeewax'ın GAE Testini kullandım. GAEUnit'i kullanmak yerine GAEUnit kullanmak benim için daha kolaydı. İşte adımlar şunlardır:

its Google Code project hosting page gelen GAEUnit ait sıkıştırılmış arşiv indirin app

  1. için GAEUnit ekleyin.
  2. arşiv Özü. arşivden çıkarılan klasöründen
  3. , uygulamanızın kök klasörüne gaeunit.py kopyalayın.

Kodu:

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

(İsteğe bağlı) arşivden çıkarılan klasöründen adında bir klasör var

  • doğrudan handlers: diyor sınırının altında, sizin app.yaml aşağıdaki 2 satırları ekleyin sample_app ve bunun içinde webtest modülünün değiştirilmiş sürümüdür. webtest modülü uygulamanızın köküne (debugapp.py ve __init__.py içeren tüm klasörü).

    GAEUnit için GAE'nin test yatağı ekleyin:

    1. GAE'nin Testbed katran its Google Code project hosting page gelen arşivi gzip'lenmesi indirin.
    2. arşiv Özü.
    3. Ayıklanan arşiv içinde gaetestbed modülüdür (“gaetestbed” adlı klasördür). Modülü uygulamanızın kök dizinine kopyalayın.
    4. Uygulamanızın kökü test klasörünün içinde bir dosya oluşturun. Bu örnek için, ona test_mailer.py adını verelim. GAE'nin Testbed Google Code proje barındırma sayfasından örneği kullanarak
    5. , test_mailer.py aşağıdaki satırları ekleyin:

    Kodu:

    import unittest 
    from gaetestbed import MailTestCase 
    
    class MyTestCase(MailTestCase, unittest.TestCase): 
        def test_email_sent(self): 
         send_email_to('[email protected]') # Some method that sends e-mail... 
         self.assertEmailSent(to='[email protected]') 
         self.assertEqual(len(self.get_sent_messages()), 1) 
    

    sunucu başlatın ve http://localhost:8080/test gidin. Bunu (ek) 1/1 testinin http://localhost:8080/test'dan çalıştırıldığını fark etmelisiniz.

    Kaynak: Using GAE Testbed with GAEUnit: Testing that email was sent

  • 2

    Sadece posta saplama aktive beri gönderilen tüm iletileri almak için aşağıdaki kullanın.

    from google.appengine.api import apiproxy_stub_map 
    sent_messages = apiproxy_stub_map.apiproxy._APIProxyStubMap__stub_map['mail'].get_sent_messages() 
    
    2

    Google, documentation bunun için gerçekten çok basit bir yol var.

    Böyle Kurulumunuzda bir test yatağı ve posta saplama oluşturun:

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

    böyle kontrol ardından yöntemini çalıştırın ve: GAEUnit için bağlantıdan

    messages = self.mail_stub.get_sent_messages(to='[email protected]') 
    self.assertEqual(1, len(messages)) 
    self.assertEqual('[email protected]', messages[0].to)