2017-03-02 1 views
0

ビジネスロジックの一部として.Netのリポジトリパターンを使用してアプリケーションを開発していますが、SMSを送信する必要があります。私のテスト中にSMSが実際に送信されないようにするためのコードはどこにあるべきですか?他の外部サードパーティサービスに依存するコードを置く場所は?

+0

ユニットテストの実行中にSMSを送信しないでください。 –

+0

これは漠然としていますが、通常はSMS Senderサービスがあります。このサービスはテストで嘲笑されます。 –

+0

これはリポジトリパターンとは何が関係していますか? – Fran

答えて

2

電子メールの送信、SMSの送信、サードパーティのWebサービスの呼び出しなどの外部のやりとりは、ビジネスレイヤーの背後にある必要があります。それらをリポジトリと平行して考えることができます。

ビジネス層は、外部サービスと対話するが、直接的には対話しないようにする必要があります。

ラッパーサービスが記述され、ビジネスレイヤーは実際の外部エンドポイントではなくラッパーサービスに依存する必要があります。

は、たとえば次の点を考慮

public interface ISmsService 
{ 
    bool SendSms(string toNumber, string messageBody); 
} 

public class TwilioSmsService : ISmsService 
{ 
    public bool SendSms(string toNumber, string messageBody) 
    { 
     // Send SMS using twilio 
     return true; 
    } 
} 

public interface ICustomerRepository 
{ 
    Customer GetCustomer(string customerId); 
} 

public class CustomerRepository : ICustomerRepository 
{ 
    public Customer GetCustomer(string customerId) 
    { 
     Expression<Func<Customer, bool>> criteria = cust => cust.CustomerId.Equals(customerId); 
     return return Context.Set<Customer>.FirstOrDefault(criteria); 
    } 
} 

public class OrderService 
{ 
    private IOrderRepository orderRepository; 
    private ISmsService smsService; 
    public ICustomerRepository customerRepository; 

    public OrderService(IOrderRepository orderRepository, ICustomerRepository customerRepository, ISmsService smsService) 
    { 
     this.orderRepository = orderRepository; 
     this.customerRepository = customerRepository; 
     this.smsService = smsService; 
    } 

    public void PlaceOrder(Order orderObj, string customerId) 
    { 
      this.orderRepository.SaveOrder(orderObj); 
      var customer = this.customerRepository.GetCustomer(customerId); 
      this.smsService.SendSms(customer.MobileNo, "You order is received successfully"); 
    } 
} 

今することができます実際にSMSを送信することなく、ユニットテストOrderServiceのは。 ISmsServiceのモックを作成し、OrderServiceの他の依存関係を作成する必要があります。

注:上記のコードはまったく例です。あなたのニーズに合ったものにするために、このことを考えて自分で考えることができます。

これは、レイヤーを整理して単体テストする方法についてのヒントを与えるはずです。

+0

素晴らしいです、ありがとうございました。トピックから少し外れていますが、私の意見では、ジェネリックリポジトリを使用して私の意見を述べることができます:https://gist.github.com/jakeam/6ccada92025389263d12e91412182cd1 –

+0

これは機能しますが、上か下。電子メールを送ることができたら本当に処理を止めたいですか? CQRSは、ドメイン論理をこれらのサービスと切り離すのに適しているようです。 – Fran

+0

合意...しかし、SMSサービスのユースケースが正常に処理されず、システムを停止させてはならない場合。サービスの監視、エラーと例外の処理、適切なロギングメカニズムにより、理解しやすく、デバッグし、修正する必要があります。ここで私が共有したのは、質問の周りを回るサンプルの例です。要件に基づいて外部サービスと統合するN種類の方法があり、ここではCQRSが最も適しています。私はあまりそれに精通していないので、それは私の心の中に来なかった。 –

関連する問題