C#中的单元测试方法?
正在尝试测试一个void方法,该方法在发生一个操作时发送电子邮件。该方法中的大多数参数都是硬编码的。根据切换情况,邮件主题也会发生变化C#中的单元测试方法?,c#,unit-testing,C#,Unit Testing,正在尝试测试一个void方法,该方法在发生一个操作时发送电子邮件。该方法中的大多数参数都是硬编码的。根据切换情况,邮件主题也会发生变化 public void SendMail(ControllerContext, admin, userList) { try { var templatePath = string.Empty; switch (pathid) { case 1:
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方法的任何可能方法都有许多硬编码值您不能对void方法进行单元测试,但可以将void方法作为单元测试的一部分,以查看类属性、提供的输入文档或数据库中的记录中是否发生了所需的变异 即
你能发布你的代码吗?您有什么版本的Microsoft Visual Studio?包含此方法的类设计不正确。在单元测试中,您确实不希望实际发送电子邮件。但是您确实希望测试模板生成。你想把它们分成不同的类。@Wazner这不一定正确。了解微软的假货。您可以生成一个模板,然后发送电子邮件,然后在单元测试中用电子邮件客户端替换一个垫片,瞧-断言发送的电子邮件与预期的已处理模板匹配。@zaitsman我不知道Microsoft Fakes支持重写框架代码。很酷。尽管如此,让类只做一件事(而不是多件事)无论如何都是一件好事。@Wazner,是的,这一点你是正确的。你说的“不能单元测试void方法”是什么意思?void方法是一种执行soemthing的方法,对于您编写的每一行代码,您都可以并且应该编写一个assert。@zaitsman,这正是我在句子的第二部分所说的。编写单元测试是为了检查变量或属性的预期结果,因为void方法都不返回,所以无法断言其值是否正确。因此,您必须对其变异的内容进行单元测试,而不是对实际方法进行单元测试。在上面的例子中,我不能做
Assert.IsTrue(sendmail()==1)
,但我可以做Assert.IsTrue(\u sentmails==1
public class SimpleEmailTest
{
private int _sentEmails;
public SimpleEmailTest()
{
this._sentEmails = 0;
}
[TestMethod]
public void TestIfEmailsGetSent()
{
SendEmail();
Assert.IsTrue(_sentEmails == 1);
}
public void SendEmail
{
// do email sending
_sentEmails++;
}
}