2009-01-09 9 views
5

Soy un novato en python y en el motor de aplicaciones.Pruebas unitarias y envío de correo electrónico burlón en Python con Google App Engine

Tengo este código que envía un correo electrónico basado en parámetros de solicitud después de cierta lógica de autenticación. en mis pruebas de unidad (estoy usando GAEUnit), ¿cómo confirmo que se envió un correo electrónico con contenido específico? - es decir, ¿cómo me burlo del e-mail con un correo electrónico falso para verificar que se haya llamado?

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

Y las pruebas unitarias,

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

Gracias por el enlace a GAEUnit. Estaba buscando algo como esto. – sastanin

Respuesta

2

Una muy breve introducción proporciona PyPI: MiniMock 1.0. Es una biblioteca muy pequeña para establecer burlas.

  1. inyectar su maqueta en el módulo, que debe ser burlado
  2. definir, lo que su maqueta volverá
  3. Llame al método
  4. Su maqueta dirá, método que se llama.

¡Buena suerte!

3

También se puede anular el método _GenerateLog en el mail_stub dentro de AppEngine.

Aquí es una clase TestCase padres que utilizo como un mixin al probar que los correos electrónicos se envían:

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) 

Después de eso, un caso de prueba de ejemplo podría ser:

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

Consulte http://gae-testbed.googlecode.com, que ofrece clases base que hacen justamente esto. –

+0

Este proyecto parece prometedor. Espero que pueda proporcionar los tutoriales ya, especialmente el que sirve para probar Mail API. – Randell

1

Utilicé Testbed GAE de jgeewax con GAEUnit. Usar GAEUnit en lugar de NoseGAE fue más fácil para mí ya que ya tenía GAEUnit en su lugar. Estos son los pasos:

Añadir GAEUnit a su aplicación

  1. Descargar el archivo comprimido de GAEUnit de its Google Code project hosting page.
  2. Extraiga el archivo.
  3. Desde la carpeta extraída del archivo, copie gaeunit.py en la carpeta raíz de su aplicación.
  4. Añadir las siguientes 2 líneas a su app.yaml, directamente debajo de la línea que dice handlers::

Código:

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

(Opcional) En la carpeta extraída del archivo, hay una carpeta con el nombre sample_app y en su interior se encuentra la versión modificada del módulo webtest. Copie el módulo webtest (la carpeta completa que contiene debugapp.py y __init__.py) en la raíz de su aplicación.

Añadir GAE banco de pruebas para GAEUnit:

  1. Descargar el alquitrán GAE banco de pruebas gzipped archivo de its Google Code project hosting page.
  2. Extraiga el archivo.
  3. Dentro del archivo extraído se encuentra el módulo gaetestbed (es la carpeta denominada "gaetestbed"). Copie el módulo a la raíz de su aplicación.
  4. Crea un archivo dentro de la carpeta de prueba de la raíz de tu aplicación. Por el bien de este ejemplo, vamos a llamarlo test_mailer.py.
  5. Usando el ejemplo de la página de alojamiento de proyectos GAE Banco de pruebas de Google Code, añada las siguientes líneas a test_mailer.py:

Código:

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) 

iniciar el servidor y vaya a http://localhost:8080/test. Debería observar que (una prueba adicional) 1/1 se ejecutó desde http://localhost:8080/test.

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

2

Sólo tiene que utilizar estos procedimientos para obtener todos los mensajes enviados desde la activación del talón de correo.

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

Google tiene una manera muy simple de hacer esto en su documentation.

se crea un banco de pruebas y el talón de correo en su configuración como esta:

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

ejecutar su método y luego comprobar de esta manera:

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