2009-01-09 14 views
5

के साथ पाइथन में यूनिट परीक्षण और मॉकिंग ईमेल प्रेषक मैं पाइथन और ऐप इंजन के लिए नौसिखिया हूं।Google AppEngine

मेरे पास यह कोड है जो कुछ औथ तर्क के बाद अनुरोध पैरा पर आधारित ईमेल भेजता है। मेरे यूनिट परीक्षणों में (मैं GAEUnit का उपयोग कर रहा हूं), मैं विशिष्ट सामग्री वाले ईमेल की पुष्टि कैसे करूं? - यानी प्रेषण को सत्यापित करने के लिए नकली ईमेलर के साथ ईमेलर का नकल कैसे किया जाए?

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>") 

और इकाई परीक्षण,

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

GAEUnit के लिए लिंक के लिए धन्यवाद। मैं इस तरह कुछ ढूंढ रहा था। – sastanin

उत्तर

2

एक बहुत ही संक्षिप्त परिचय PyPI: MiniMock 1.0 प्रदान करता है। यह मोज़े स्थापित करने के लिए एक बहुत छोटी पुस्तकालय है।

  1. मॉड्यूल, कि मज़ाक उड़ाया जाना चाहिए
  2. को परिभाषित करें, जो आपके नकली वापस आ जाएगी
  3. कॉल विधि
  4. आपका नकली कहेंगे, जो विधि कहा जाता था में अपने नकली सम्मिलित करें।

शुभकामनाएं!

3

आप एपइंजिन के अंदर mail_stub में _GenerateLog विधि को ओवरराइड भी कर सकते हैं।

यहाँ एक माता पिता testcase वर्ग है कि मैं एक mixin के रूप में उपयोग जब परीक्षण है कि ई-मेल भेजा जाता है है:

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

http://gae-testbed.googlecode.com देखें जो बेस क्लास देता है जो यह करता है। –

+0

यह प्रोजेक्ट आशाजनक लग रहा है। मुझे आशा है कि आप पहले से ही ट्यूटोरियल प्रस्तुत कर सकते हैं, खासकर मेल एपीआई का परीक्षण करने के लिए। – Randell

1

:

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) 

उसके बाद, एक नमूना परीक्षण का मामला कैसा लग सकता है मैंने GAEUnit के साथ जेजवेक्स के जीएई टेस्टबेड का इस्तेमाल किया। NoseGAE के बजाय GAEUnit का उपयोग करना मेरे लिए आसान था क्योंकि मेरे पास पहले से ही GAEUnit था। ये कदम उठाएँ:

अपने अनुप्रयोग

  1. को GAEUnit जोड़े GAEUnit की ज़िपित संग्रह डाउनलोड its Google Code project hosting page से।
  2. संग्रह निकालें।
  3. संग्रह से निकाले गए फ़ोल्डर से, अपने ऐप के रूट फ़ोल्डर में gaeunit.py कॉपी करें।

कोड::

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

(वैकल्पिक) फ़ोल्डर संग्रह से निकाले से, वहाँ नाम का एक फ़ोल्डर है

  • सीधे लाइन है कि कहते हैं handlers: क्लिक करें, अपना app.yaml के लिए निम्न 2 लाइनों जोड़े sample_app और इसके अंदर webtest मॉड्यूल का संशोधित संस्करण है। अपने ऐप की रूट पर webtest मॉड्यूल (पूरे फ़ोल्डर में debugapp.py और __init__.py) की प्रतिलिपि बनाएँ।

    GAEUnit को GAE टेस्टबेड जोड़ें:

    1. डाउनलोड GAE टेस्टबेड टार its Google Code project hosting page से संग्रह gzipped।
    2. संग्रह निकालें।
    3. निकाले गए संग्रह के अंदर gaetestbed मॉड्यूल है (यह "gaetestbed" नामक फ़ोल्डर है)। मॉड्यूल को अपने ऐप की जड़ पर कॉपी करें।
    4. अपने ऐप की रूट के परीक्षण फ़ोल्डर के अंदर एक फ़ाइल बनाएं। इस उदाहरण के लिए, चलिए इसे test_mailer.py नाम दें।
    5. GAE टेस्टबेड गूगल कोड परियोजना होस्टिंग पृष्ठ से उदाहरण का उपयोग करना, test_mailer.py निम्न पंक्तियां जोड़ें:

    कोड:

    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) 
    

    अपने सर्वर शुरू करें और http://localhost:8080/test में जाते हैं। आपको ध्यान देना चाहिए कि (एक अतिरिक्त) 1/1 परीक्षण http://localhost:8080/test से चलाया गया था।

    स्रोत: Using GAE Testbed with GAEUnit: Testing that email was sent

  • 2

    बस मेल ठूंठ को सक्रिय करने के बाद से भेजे गए सभी संदेशों को पाने के लिए निम्नलिखित का उपयोग करें।

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

    Google के पास documentation में ऐसा करने का एक बहुत ही आसान तरीका है।

    आप इस तरह अपने सेटअप में एक testbed और मेल ठूंठ बनाएँ:

    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='[email protected]') 
    self.assertEqual(1, len(messages)) 
    self.assertEqual('[email protected]', messages[0].to) 
    
    संबंधित मुद्दे