2016-12-27 169 views
-3

我真的想要测试每当发生一个动作时发送通知电子邮件的方法。该方法中的大部分参数都是硬编码的。喜欢电子邮件模板有参数主题,标题和正文。我的方法参数是userMailId,adminName和ControllerContext用于生成模板。单元测试C#中的void方法?

我的代码

公共无效的SendMail(ControllerContext,管理员,用户列表) { 尝试 {VAR =的templatePath的String.Empty; var subject = string.Empty; var viewModel = new EmailModel();

  switch (pathid) 
      { 
       case 0: 
        if (pathId == 3) 
         templatePath = "AllCategoryTemplate";    
        else 
         templatePath = "SpecificTemplate";   
        break; 

       case 1: 
        templatePath = "AllTemplate";      
        break; 

       case 2: 
        templatePath = "CategoryTemplate"; 
        break; 
      }     

      switch (urlId) 
      { 
       case 1: 
        viewModel.ItemUrl = "itemurl"; 
        break; 
       case 2: 
        viewModel.ItemUrl = "itemurl1"; 
        break; 
       case 3: 
        viewModel.ItemUrl = "itemurl2"; 
        break; 
       default: 
        viewModel.ItemUrl = "itemurl23"; 
        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) 
     { 
      LogExtension.LogError("Error in sending notification email", ex, MethodBase.GetCurrentMethod()); 
     }    
    } 
+1

你能发布你的代码吗?你有什么版本的Microsoft Visual Studio? – zaitsman

+0

包含此方法的类未正确设计。在单元测试中,你真的不想实际发送电子邮件。但是想要测试模板生成。你想把他们分成不同的班级。 – Wazner

+0

@Wazner这不一定正确。阅读微软假货。你可以生成一个模板,并发送电子邮件,然后在单元测试中用电子邮件客户端替代填充,然后瞧 - 发送电子邮件发送匹配的预期模板处理。 – zaitsman

回答

1

不能单元测试无效的方法,但你可以做一个单元测试的无效方法部分,看是否有希望的突变的类属性已发生,在数据库中提供的输入文件或记录。

I.e.

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

你是什么意思'你不能单元测试一个无效的方法'?一个void方法是一种方法,它为你编写的每一行代码都可以并且应该写一个断言。 – zaitsman

+0

@zaitsman这正是我在我的句子的第二部分所说的。你编写了一个单元测试来检查变量或属性的预期结果,既然void方法不返回,你不能断言它的值是否正确。因此,你必须单元测试它的变化,而不是单元测试实际的方法。按照上面的例子,我不能'Assert.IsTrue(SendEmail()== 1)',但我可以'Assert.IsTrue(_sentEmails == 1' – Chrotenise