【问题标题】:Unit testing void methods in C#?C#中的单元测试void方法?
【发布时间】: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


【解决方案1】:

您不能对 void 方法进行单元测试,但可以将 void 方法作为单元测试的一部分,以查看在类属性、提供的输入文档或数据库中的记录中是否发生了所需的突变。

即

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

【讨论】:

  • “你不能对 void 方法进行单元测试”是什么意思? void 方法是一种做某事的方法,对于您编写的每一行代码,您都可以并且应该编写一个断言。
  • @zaitsman 这正是我在句子第二部分所说的。您编写单元测试来检查变量或属性的预期结果,由于 void 方法不返回任何内容,因此您无法断言其值是否正确。因此,您必须对它变异的内容进行单元测试,而不是对实际方法进行单元测试。按照上面的例子,我不能做Assert.IsTrue(SendEmail() == 1),但我可以做Assert.IsTrue(_sentEmails == 1
猜你喜欢
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
相关资源
最近更新 更多