2016-12-27 115 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