2016-12-27 6 views
-3

私は本当に1つのアクションが発生するたびに通知メールを送信するメソッドをテストしようとしています。このメソッドのパラメータのほとんどはハードコードされています。メールテンプレートのように、パラメータの件名、見出し、本文があります。私のメソッドのパラメータは、テンプレート生成のためのuserMailId、adminNameおよびControllerContextです。C#のユニットテストのvoidメソッド?

マイコード

ます。public voidのSendMail(ControllerContext、管理者、ユーザリスト) { が { VAR templatePath = String.Emptyをしてみてください。 var subject = string.Empty; var viewModel =新しい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

@ワーズナーそれは必ずしも正しいとは限りません。 Microsoft Fakesで読む。あなたはテンプレートを生成し、電子メールを送信することができますし、単体テストでは、電子メールクライアントにシムとボイラーを代用します。 – zaitsman

答えて

1

あなたはユニットvoidメソッドをテストすることはできませんが、所望の変異がクラスプロパティで発生したかどうかを確認するためにユニットテストのvoidメソッドの一部を行うことができますが、データベースに入力された文書や記録を供給しました。

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メソッドを使用できない」ということはどういう意味ですか? voidメソッドは、あなたが書くことができるコードの各行に対して、assertを書くことができるし、書くべきであるという点で、soemthingを行うメソッドです。 – zaitsman

+0

@zaitsmanこれはまさに私の文の第二部で私が言っていることです。変数やプロパティの期待される結果をチェックする単体テストを書く。voidメソッドはどちらも返さないので、その値が正しいかどうかをアサートすることはできない。したがって、実際のメソッドを単体テストするのではなく、それが何を突き詰めているのかを単体テストする必要があります。上の例の行では、 'Assert.IsTrue(SendEmail()== 1)'を実行することはできませんが、 'Assert.IsTrue(_sentEmails == 1) – Chrotenise

関連する問題