【发布时间】:2010-11-06 16:20:17
【问题描述】:
所以我的代码中有一些 SMTP 内容,我正在尝试对该方法进行单元测试。
所以我一直在尝试模拟 MailMessage,但它似乎从来没有工作过。我认为这些方法都不是虚拟的或抽象的,所以我不能使用 moq 来模拟它:(。
所以我想我必须手动完成,这就是我卡住的地方。
*手工我的意思是了解接口和包装器,但让 moq 仍然模拟接口。
我不知道如何编写我的接口和包装器(一个将实现具有实际 MailMessage 代码的接口的类,因此当我的真实代码运行时,它实际上会完成它需要做的事情)。
所以首先我不确定如何设置我的界面。让我们看一下我必须模拟的字段之一。
MailMessage mail = new MailMessage();
mail.To.Add("test@hotmail.com");
所以这是我必须伪造的第一件事。
所以看着它我知道“To”是一个属性,通过在“To”上按 F12 将我带到这一行:
public MailAddressCollection To { get; }
所以它是 MailAddressCollection 属性。但是有些方法允许我走得更远并做“添加”。
所以现在我的问题是在我的界面中我要做什么?
我做财产吗?这个属性应该是 MailAddressCollection 吗?
或者我应该有类似的方法吗?
void MailAddressCollection To(string email);
or
void string To.Add(string email);
那么我的包装器会是什么样子?
所以你可以看到我很困惑。因为他们太多了。我猜我只是模拟我正在使用的那些。
编辑代码
我想在真正意义上我只需要测试更多的异常,但我想测试以确保所有东西都被发送然后它会得到响应 = 成功。
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;
}
谢谢
【问题讨论】:
标签: c# asp.net-mvc unit-testing mocking