2011-01-14 7 views
2

私が偽装して単体テストできる電子メール通知サービスクラスを作成するにはどうすればよいですか?asp.net mvcの電子メールまたは通知サービスを設定するには

私のサービスは、クラスライブラリである別のレイヤーにあります。私はsmtpクライアントをインポートしないようにしようとしていますが、これがやむを得ない場合は、問題はありません。これは今私が持っているものです:

+1

メールを送信することは、実際にはそれが聞こえるよりもはるかに複雑であり、そうするべきです。 http://www.codinghorror.com/blog/2010/04/so-youd-like-to-send-some-email-through-code.html –

+1

ここで何をテストしますか?このクラスでは単位テストをすることはほとんどできません。実際に電子メールを送信するというテストは、統合テストです。 –

+0

EmailNotificationServiceに何を期待しますか?電子メールを送信する...私はあなたのデザインが複雑すぎると思う。 – clyc

答えて

1

System.Net.Mailライブラリをインポートしない場合は、インターフェイスを使用する必要があります。これは本当に

public interface IEmailSender{ 
    void Send(EmailNotification emailNotification); 
} 

かかわらず、あなたのユニットテストのための多くを解決しないと、あなたのEmailNotificationServiceクラスで使用すると、次のプロパティを追加することができたり、コンストラクタでIEmailSenderに

private IEmailSender emailSender; 

public IEmailSender EmailSender 
{ 
    get{ 
      if(this.emailSender == null){ 
       //Initialize new EmailSender using either 
       // a factory pattern or inject using IOC 
      } 
      return this.emailSender 
    } 
    set{ 
      this.emailSender = value; 
    } 
} 

を渡すことに注意してくださいあなたの通知なる方法

public void Notify() 
{ 
    EmailSender.Send(_emailNotification); 
} 

あなたは、IEmailSenderインタフェースを実装する具象クラスを作成します

public class MyEmailSender: IEmailSender 
{ 
    public void Send(EmailNotification emailNotification) 
    { 
     using (var mail = new MailMessage()) 
     { 
      //If no replyto was passed in the notification, then make it null. 
      mail.ReplyTo = 
        string.IsNullOrEmpty(_emailNotification.ReplyTo) ? null : 
        new MailAddress(_emailNotification.ReplyTo); 

      mail.To.Add(emailNotification.To); 
      mail.From = emailNotification.From; 
      mail.Subject = emailNotification.Subject; 
      mail.Body = emailNotification.Body; 
      mail.IsBodyHtml = true; 

      SmtpClient client = new SmtpClient(); 
      client.Send(mail); 
     } 
    } 
} 
+1

IEmailSenderインターフェイスのプライベートフィールドに基づいてプロパティをバックアップするのではなく、コンストラクタパラメータとして渡すことをお勧めします。しかしどちらの方法でも、ゲッターが元のコードではなかった適切なインスタンスを返す以外に何かテストする必要はありません。そのため、OPは単体テストの元の実装ではまだ何も持っていません。 –

+0

本当にテストすることはあまりありません。あなたが言ったように、それはメールを送信するか、それとも – clyc

関連する問題