C#中的单元测试方法?

C#中的单元测试方法?,c#,unit-testing,C#,Unit Testing,正在尝试测试一个void方法,该方法在发生一个操作时发送电子邮件。该方法中的大多数参数都是硬编码的。根据切换情况,邮件主题也会发生变化 public void SendMail(ControllerContext, admin, userList) { try { var templatePath = string.Empty; switch (pathid) { case 1:

正在尝试测试一个void方法,该方法在发生一个操作时发送电子邮件。该方法中的大多数参数都是硬编码的。根据切换情况,邮件主题也会发生变化

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++;
   }
}