Así que tengo algunas cosas SMTP en mi código y estoy tratando de probar ese método unitariamente.¿Cómo hago una maqueta de System.Net.Mail MailMessage?
Así que he estado tratando de maquetar MailMessage pero parece que nunca funciona. Creo que ninguno de los métodos son virtuales o abstractos, así que no puedo usar moq para burlarse hasta :(.
Así que supongo que tengo que hacerlo a mano y ahí es donde estoy atascado.
* a mano quiero decir con la interfaz y el envoltorio, pero dejando que moq siga simulando la interfaz.
No sé cómo escribir mi interfaz y mi Wrapper (una clase que implementará la interfaz que tendrá el código de MailMessage real) así que cuando mi código real se ejecuta realmente hace las cosas que necesita hacer).
Así que primero no estoy seguro de cómo configurar mi interfaz. Eche un vistazo a uno de los campos que tengo que maqueta.
MailMessage mail = new MailMessage();
mail.To.Add("[email protected]");
así que esto es lo primero que tengo que fingir.
por lo mirarlo sé que "A" es una propiedad pulsando F12 sobre "A" que me lleva a la siguiente línea:
public MailAddressCollection To { get; }
Por lo tanto, es MailAddressCollection propiedad. Pero de alguna forma puedo ir más allá y hacer "Agregar".
Así que ahora mi pregunta es en mi interfaz ¿qué hago?
hago una propiedad? ¿Debería esta propiedad ser MailAddressCollection?
¿O debería tener un método como?
void MailAddressCollection To(string email);
or
void string To.Add(string email);
¿Cómo se vería mi envoltorio?
Así que como pueden ver, estoy muy confundido. Ya que hay tantos de ellos. Supongo que solo simulé los que estoy usando.
editar código
supongo que en cierto sentido en un sólo tendría que probar más las excepciones pero quiero poner a prueba para asegurarse de que si todo se envía entonces se llega a la respuesta = éxito.
string response = null;
try
{
MembershipUser userName = Membership.GetUser(user);
string newPassword = userName.ResetPassword(securityAnswer);
MailMessage mail = new MailMessage();
mail.To.Add(userName.Email);
mail.From = new MailAddress(ConfigurationManager.AppSettings["FROMEMAIL"]);
mail.Subject = "Password Reset";
string body = userName + " Your Password has been reset. Your new temporary password is: " + newPassword;
mail.Body = body;
mail.IsBodyHtml = false;
SmtpClient smtp = new SmtpClient();
smtp.Host = ConfigurationManager.AppSettings["SMTP"];
smtp.Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["FROMEMAIL"], ConfigurationManager.AppSettings["FROMPWD"]);
smtp.EnableSsl = true;
smtp.Port = Convert.ToInt32(ConfigurationManager.AppSettings["FROMPORT"]);
smtp.Send(mail);
response = "Success";
}
catch (ArgumentNullException ex)
{
response = ex.Message;
}
catch (ArgumentException ex)
{
response = ex.Message;
}
catch (ConfigurationErrorsException ex)
{
response = ex.Message;
}
catch (ObjectDisposedException ex)
{
response = ex.Message;
}
catch (InvalidOperationException ex)
{
response = ex.Message;
}
catch (SmtpFailedRecipientException ex)
{
response = ex.Message;
}
catch (SmtpException ex)
{
response = ex.Message;
}
return response;
}
Gracias
Hmm Creo que entiendo lo que dices, pero deja doble chekc. ¿Está diciendo que debido a que MailMessage es todo el código que se escribió para mí, no tengo que probarlo y dado que MailMessage no tiene realmente nada que ver con mis pruebas, además de que Mailmessage realmente no causa ninguna dependencia, realmente es solo snt. send() que crea la dependencia ¿verdad? Así que realmente solo tengo que falsificar la pieza de envío para romper cualquier dependencia ¿no? Mi pensamiento era que MailMessage era una dependencia, pero ahora que lo veo puedo ver que realmente no lo es. ¿Es correcto y qué intenta decir? – chobo2
OH y una cosa más que uso cosas como ConfigurationManager.AppSettings ["SMTP"]; ¿Debo simular que ConfigurationManager rompa la dependencia de un archivo AppConfig o debería simplemente crear un archivo appConfig? – chobo2
Derecha. No desea probar MailMessage o SmtpClient; no es tu código Desea probar de forma unitaria todo lo que usa USES MailMessage y SmtpClient para asegurarse de que: a) están creando un MailMessage con los campos correctos; yb) en realidad están enviando el correo electrónico. –