2011-03-09 31 views
20

Me gustaría probar mi funcionalidad de envío de correo electrónico utilizando .NET (C#) framework o cualquier biblioteca compatible, ¿alguna sugerencia de cómo hacerlo?¿Cómo probar el correo electrónico de prueba unitaria?

+0

¿Recibes un correo electrónico cuando se ejecuta el código? –

+0

¿Cómo se ve el código? –

+0

Quizás podría mostrar el código de la * funcionalidad * que está tratando de probar, ¿no cree? –

Respuesta

0

Generalmente tengo una configuración "OverrideEmailAddress" que establezco en mi propio correo electrónico y luego las pruebas de correo electrónico que ejecuta no van a su cliente ni a quien sea que vaya originalmente. Tengo un método de ayuda al que envío todos los correos electrónicos y este método usará la configuración si existe. Opcionalmente, puede agregar al final del correo electrónico quién habría sido el destinatario original.

Si necesita confirmar que recibió el correo electrónico, deberá escribir un código para verificar la dirección de correo electrónico y luego confirmar que el mensaje es correcto.

No estoy seguro de si esto es lo que quiere decir o no.

31

Si necesita prueba de envío de correo electrónico única, se puede configurar el archivo .config como esto

<system.net> 
    <mailSettings> 
     <smtp deliveryMethod="SpecifiedPickupDirectory"> 
      <specifiedPickupDirectory pickupDirectoryLocation="C:\TempMail" /> 
     </smtp> 
    </mailSettings> 
</system.net> 

Con estos ajustes los mensajes no se envían a través de la red, pero se dejan caer como archivos físicos con extensión .eml en la carpeta que configuró en el atributo pickupDirectoryLocation. Puede verificarlos con la ayuda de las clases en el espacio de nombres System.IO.

La documentación de MSDN es here

+0

Sería genial tener el enlace msdn en la configuración. – mathk

17

estoy de acuerdo con la idea de tener que enviar un correo electrónico durante las pruebas unitarias. Eso exige muchos problemas con la OMI y va en contra de lo que se supone que es la prueba unitaria.

En mi aplicación, tengo una interfaz IMailManager con métodos como SendPasswordResetEmail(string emailAddress) y similares. Me burlo de este objeto durante la prueba unitaria y solo me aseguro de que mis componentes llaman al método correcto de administrador de correo.

Mi implementación real de producción de MailManager normalmente usa System.Net.Mail.SmtpClient internamente, que no es necesario que pruebe. Deje que Microsoft lo pruebe. Todo lo que necesita hacer es asegurarse de que su configuración smtp esté configurada correctamente durante la implementación, lo cual no debe ser la preocupación de las pruebas unitarias.

Si necesita probar su componente de correo, es decir, asegúrese de que esté generando el cuerpo correcto del mensaje y similares, recomendaría burlarse de lo que se necesita para aislar esa funcionalidad en una prueba de unidad autónoma.

+1

¿Y cómo sabe si su método SendPasswordResetEmail se implementa correctamente? Tu no Es por eso que debes probarlo. Es cierto que probablemente no llame a esta prueba unitaria, pero deben probarse independientemente. –

+3

@SleeperSmith eso no es una prueba unitaria, es una prueba de integración, ya que se comunica con un sistema externo. Este tipo de prueba es necesaria, pero no en una capacidad de prueba unitaria. –

+0

La pregunta era probar la "funcionalidad de envío de correo electrónico" real. Estoy bastante seguro de que el autor de "prueba de unidad" realmente tenía en mente una especie de prueba de integración. – whyleee

0

Probablemente escribiría una capa de abstracción muy delgada sobre la clase .NET SmtpClient. Entonces podría sustituir con una clase de maqueta por pruebas unitarias. Por supuesto, no podrías probar el envoltorio de la unidad, pero debería ser prácticamente trivial de todos modos y casi nunca cambiará.

0

Hay una manera muy simple de probar los contenidos del correo electrónico en los tests de aprobación (www.approvaltests.com o nuget). El código es simple:

EmailApprovals.Verify(mail); 

Esto creará el archivo .eml, y le permitirá ver el resultado en outlook. Además, una vez que aprueba el resultado (cambie el nombre del archivo a .aprobado), la prueba pasará sin abrir Outlook. (Es un proceso muy similar al que @whyleee mencionó, pero no usa el archivo de configuración.)

I have published a short video on the process on YouTube.

11

No es necesario que pruebe el correo electrónico real enviando característica; eso es parte del framework .NET y ya ha sido probado.

Lo que necesita para probar la unidad es el correo electrónico creación lógica de negocios. Encapsularlo en un servicio como este:

public interface IPasswordResetEmailCreator 
{ 
    MailMessage Create(string emailAddress); 
} 

E implementarlo. Luego, escriba una prueba unitaria para esta implementación y verifique que MailMessage devuelve conforme a sus requisitos.

Un ejemplo de implementación de esta unidad de prueba utilizando el SpecsFor marco:

public class PasswordResetEmailCreatorSpecs 
{ 
    public class given_a_registered_user : SpecsFor<PasswordResetEmailCreator> 
    { 
     private string _emailAddress; 
     private MailMessage _email; 

     protected override void Given() 
     { 
      _emailAddress = "[email protected]"; 
     } 

     protected override void When() 
     { 
      _email = SUT.Create(_emailAddress); 
     } 

     [Test] 
     public void then_the_body_must_contain_the_reset_uri() 
     { 
      _email.Body.ShouldContain("/Password/Reset/"); 
     } 

     [Test] 
     public void then_the_email_must_be_for_the_user() 
     { 
      _email.To[0].Address.ShouldEqual(_emailAddress); 
     } 

     [Test] 
     public void then_the_subject_must_be_the_expected() 
     { 
      _email.Subject.ShouldEqual("Your email reset link"); 
     } 
    } 
} 
0

Si desea probarlo, recomiendo mirar mail4net: www.mail4net.com

Es un producto comercial, pero le permite enviar correos electrónicos usando un servicio SMTP falso y luego consultar el falso.

// Create Mail4Net FakeClient. 
var client = new Mail4Net.Client.FakeClient(); 

// Send email. 
client.Send(from, to, subject, body); 

Y luego, se puede consultar el cliente:

// Count the number of emails sent. 
var count = client.Count(); 

// Get first email. 
var message = client[0]; 
0

Mi enfoque rápido y sucio era muy similar a la top answer by whylee excepto que no requiere tocar ningún archivo de configuración (porque podría necesitar diferentes configuraciones para diferentes unidad de pruebas)

dentro de su código de correo electrónico de envío de

if (ConfigurationManager.AppSettings["smtpDir"] == null) 
    smtp.DeliveryMethod = SmtpDeliveryMethod.Network; 
else 
{ 
    smtp.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; 
    smtp.PickupDirectoryLocation = ConfigurationManager.AppSettings["smtpDir"]; 
} 

en su unidad de prueba

ConfigurationManager.AppSettings["smtpDirectory"] = dir; 

//do some testing then change it back 

ConfigurationManager.AppSettings["smtpDirectory"] = null; 

PS. Sé todas las desventajas, pero por si alguien necesita esto ...

Cuestiones relacionadas