2011-05-21 15 views
8

No puedo ejecutar con éxito las pruebas unitarias de MvcMailer utilizando Visual Studio Suite y Moq. he copiado el ejemplo de la palabra wiki por palabra, sino obtener la siguiente excepción cada vez que:Pruebas de la unidad MvcMailer: System.ArgumentNullException httpContext no puede ser nulo

Test method MvcMailerTest.Tests.MailerTest.TestMethod1 threw exception: 
System.ArgumentNullException: Value cannot be null. 
Parameter name: httpContext 

Código es el siguiente: (Utilizando el marco de prueba de unidad VS - exactamente el mismo error al utilizar nUnit como en el ejemplo)

 //Arrange: Moq out the PopulateBody method 
     var _userMailerMock = new Mock<UserMailer>(); 
     _userMailerMock.Setup(mailer => mailer.PopulateBody(It.IsAny<MailMessage>(), "Welcome", null));    
     _userMailerMock.CallBase = true; 

     //Act 
     var mailMessage = _userMailerMock.Object.Welcome(); 

falla en la línea siguiente en el método de bienvenida() (copiado directamente de la wiki):

PopulateBody(mailMessage, viewName: "Welcome"); 

el wiki está aquí: https://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide

similares (casi exactamente el mismo) Pregunta: MvcMailer: Can't complete NUnit tests on Razor Views which use Url.Action

Alguien sabe cómo solucionar/evitar esto? La pregunta vinculada dice que necesito burlarme del método PopulateBody que hice (según la wiki).

+0

Este [problema se informó] (https://github.com/smsohan/MvcMailer/issues/20) al equipo de MVC Mailer, pero se cerró sin una resolución. ¿Alguien tiene una solución/solución? – jhappoldt

+0

@Josh, desafortunadamente todavía no he encontrado una solución o una solución. Supongo que este error está en manos de MVC mailer devs ... – woggles

+2

una solución alternativa es cambiar su código a esto: 'PopulateBody (mailMessage," Welcome ", null);' Esto funcionará porque tiene una configuración simulada para ese sobrecarga de PopulateBody y no para la versión de 2 parámetros. –

Respuesta

2

una solución consiste en cambiar el código para esto:

PopulateBody(mailMessage, "Welcome", null);

Esto funciona porque tiene una configuración simulada para esa sobrecarga de PopulateBody y no para la versión de 2 parámetros de la misma ...

0

Probablemente necesite burlarse de HttpContext también. Puede hacerlo creando un objeto simulado HttpContextBase y asignándolo a su objeto Controller.

+0

Estoy tratando de probar el programa de correo por ahora, no el controlador que usa el programa de correo (¡si eso hace la diferencia!). – woggles

0

Sospecho que se está reasignando un nuevo simulacro a la variable _userMailerMock y, por lo tanto, no se burla del método PopulateBody.

var _userMailerMock = new Mock<UserMailer>(); 
_userMailerMock.Setup(mailer => mailer.PopulateBody(It.IsAny<MailMessage>(), "Welcome", null)); 
_userMailerMock.CallBase = true; 

sacar la segunda asignación _userMailerMock = new Mock<UserMailer>(); la línea antes de Callbase = true;

+0

Vaya, pegué el código en stackoverflow incorrectamente. Solo hay 1 asignación para _userMailerMock en el código. Todavía obtengo el mismo error. – woggles

3

Una adición rápida a la respuesta de Filip que alguien podría encontrar útil: estoy usando la versión 4.0 del paquete MvcMailer. Estaba usando el método Populate(Action<MvcMailMessage> action) dentro de mis acciones Mailer y se dio cuenta de que utiliza una versión -parámetro cuatro de PopulateBody:

// Mvc.Mailer.MailerBase (using ILSpy) 
public virtual MvcMailMessage Populate(Action<MvcMailMessage> action) 
{ 
    MvcMailMessage mvcMailMessage = new MvcMailMessage(); 
    action(mvcMailMessage); 

    // Four parameters! (comment added by me) 
    this.PopulateBody(mvcMailMessage, mvcMailMessage.ViewName, mvcMailMessage.MasterName, mvcMailMessage.LinkedResources); 

    return mvcMailMessage; 
} 

Como tal, he encontrado que la creación de la maqueta con cuatro parámetros ...

PopulateBody(mailMessage, "Welcome", "SomeMasterName", null); 

... hizo el truco.

+0

¡Gracias! La Wiki debe actualizarse a la nueva versión. Buen trabajo – thmshd

Cuestiones relacionadas