【发布时间】:2017-05-11 14:55:54
【问题描述】:
尝试测试一个 void 方法,该方法在一个操作发生时发送电子邮件。这个方法里面的大部分参数都是硬编码的。基于 switch case 邮件主题也会发生变化。
public void SendMail(ControllerContext, admin, userList)
{
try
{
var templatePath = string.Empty;
switch (pathid)
{
case 1:
templatePath = "XXX";
default:
break;
}
switch (urlId)
{
case 1:
viewModel.ItemUrl = "URL";
break;
default:
break;
}
foreach (var user in userList)
{
viewModel.FirstName = user.FirstName;
viewModel.LastName = user.LastName;
string bodyOftheContent = Generator.TemplateGeneration(ControllerContext, tempatePath);
Object.SendCustomMail(user.Email, bodyOftheContent, subject);
}
}
catch (Exception ex)
{
LogError("Error in sending notification email", ex, MethodBase.GetCurrentMethod());
}
}
任何对内部 void 方法进行单元测试的可能方法都有很多硬编码值
【问题讨论】:
-
你能发布你的代码吗?你有什么版本的 Microsoft Visual Studio?
-
包含此方法的类设计不当。在单元测试中,您真的不想实际发送电子邮件。但是确实想测试模板生成。您想将它们分成单独的类。
-
@Wazner 这不一定正确。阅读 Microsoft Fakes。您可以生成一个模板,然后发送电子邮件,然后在单元测试中用电子邮件客户端替换一个 shim 和瞧 - 断言发送的电子邮件与处理的预期模板匹配。
-
@zaitsman 我不知道 Microsoft Fakes 支持重写框架代码。很酷。尽管如此,让班级做一件事情(而不是多件事情)无论如何都是一件好事。
-
@Wazner,是的,你说得对。
标签: c# unit-testing