2009-05-06 14 views
1

私は電子メールサービス(SMTPを使用して)のために書いたユニットテストを見ていますが、特に1つのテストで十分かどうか疑問に思っています。ここに私の電子メールサービスの抜粋です:ユニットテストは十分ですか?

[PluginFamily("EmailService")] 
public interface IEmailService 
{ 
    Boolean SendEmail(string toAddress, string fromAddress, string bccAddress, string ccAddress, string subject, 
         string body, bool html); 
} 
[Pluggable("EmailService")] 
public class EmailService : IEmailService 
{ 
    private IConfigurationReader _configReader; 
    public EmailService(IConfigurationReader configurationReader) 
    { 
     _configReader = configurationReader; 
    } 
    public bool SendEmail(string toAddress, string fromAddress, string bccAddress, string ccAddress, string subject, string body, bool isHtml) 
    { 
     MailMessage email = new MailMessage(); 

     try 
     { 
      if (_configReader.TestMode) 
      { 
       toAddress = _configReader.TestEmailAddress; 
      } 
     } 

     //send email here 
    } 
} 

私はIConfigurationReader(のConfigurationManagerのための基本的ラッパー)をあざける、私は私の「テストモード」でメールを送信できるかどうかをテストするために、trueにテストモードを設定しています。

[Test] 
    public void Validate_Send_Email_In_Test_Mode() 
    { 
     bool result; 
     MockRepository mockRepository = new MockRepository(); 
     var mockConfigReader = mockRepository.StrictMock<IConfigurationReader>(); 


     using (mockRepository.Record()) 
     { 

      SetupResult.For(mockConfigReader.TestMode).Return(true); 
      SetupResult.For(mockConfigReader.TestEmailAddress).Return("[email protected]"); 
      SetupResult.For(mockConfigReader.EmailContentLocation).Return("test"); 
      SetupResult.For(mockConfigReader.SmtpHost).Return("test.mail.com"); 
     } 

     ObjectFactory.InjectStub(typeof(IConfigurationReader), mockConfigReader); 
     emailService = ObjectFactory.GetInstance<IEmailService>(); 

     using (mockRepository.Playback()) 
     { 
      result = emailService.SendEmail("[email protected]", 
                "[email protected]", "", "", 
                "this is a unit test - config in test mode", "body of unit test", true); 

     } 

     Assert.That(result, Is.True); 
     ObjectFactory.ResetDefaults(); 

    } 

が、これはユニットテストのために十分に十分なものである:だから、私のユニットテストは、この(これは方法の私のユニットテストの一つであり、私は100%のコードカバレッジを持っている)のようになりますか?それを改善するために私は何ができますか?

私の方法が真実に戻っているかどうかをチェックするだけでは、単体テストでは十分ではないと懸念しています。

答えて

2

改善あなたのcode coverage(タイプのすべて)

+2

多くの人がコードカバレッジは良いテストの大きな兆候ではないと言うでしょうが、特にコードカバレッジが2%の場合は、明らかに長い道のりです。 コードカバレッジを初めて使用している場合は、98%になり、最後の例外がすべて発生する心配はありません。 ちょうど私の2セントです。 –

+0

アレン - 電子メールサービスで100%カバーしています。私は私の単体テストが十分であるかどうかを見たいと思っています... –

+1

100%の機能範囲と適切な分岐範囲が良い指標になるはずです:) – workmad3

2

私はあなたにも、さまざまな可能性のあるエラー条件が満たされたときに「成功」​​している負のテストを含めることをお勧めします。たとえば、無効な電子メールアドレスを渡し、適切なエラーコードおよび/または例外が返されたことを確認します。

また、実際のSMTPサーバーをモックアップすることもできます。私は多くの検索をしなかったが、私はthis SMTP server mock siteを見つけた。私はJavaプロジェクトの電子メールプラグインのテストでこれに似た方法を使用しました。そうすれば、テストモードか生産モードかどうかは気にしません。唯一の違いは、構成内のサーバー/ポートの組み合わせです。これには、「テストコード」のテストだけではないという利点があります。

1

私はこの部分だと思います:

{ 
     if (_configReader.TestMode) 
     { 
      toAddress = _configReader.TestEmailAddress; 
     } 
    } 

は、コードのにおいです。トーメールアドレスを渡して、メソッドにパラメータとして渡されたものと一緒にサービスが呼び出されていることを確認し、モックを使用して電子メールAPIに正しく送信されたことを確認する必要があります。言い換えれば、電子メールAPIを模擬し、Mockをテスト対象として使用しないでください。

これを書いて試してみると、最初にテストすることができます。ここでは、プロダクションコードが書き込むことを正当化するテストを行うことができます。

2

電子メールを送信できないことがありますか?可能であれば、テストするケースは少なくとも2つあり、1回のテストでは十分ではありません。

戻り値が真であるため、2つの戻りコードのいずれかを期待していることを示唆しているので、すべての可能性をテストしているわけではありません。

電子メールを送信するときは、戻り値は関数の結果の中で最も重要ではありません。電子メールが送信されましたか?

関連する問題