ビジネスロジックの一部として.Netのリポジトリパターンを使用してアプリケーションを開発していますが、SMSを送信する必要があります。私のテスト中にSMSが実際に送信されないようにするためのコードはどこにあるべきですか?他の外部サードパーティサービスに依存するコードを置く場所は?
答えて
電子メールの送信、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の他の依存関係を作成する必要があります。
注:上記のコードはまったく例です。あなたのニーズに合ったものにするために、このことを考えて自分で考えることができます。
これは、レイヤーを整理して単体テストする方法についてのヒントを与えるはずです。
素晴らしいです、ありがとうございました。トピックから少し外れていますが、私の意見では、ジェネリックリポジトリを使用して私の意見を述べることができます:https://gist.github.com/jakeam/6ccada92025389263d12e91412182cd1 –
これは機能しますが、上か下。電子メールを送ることができたら本当に処理を止めたいですか? CQRSは、ドメイン論理をこれらのサービスと切り離すのに適しているようです。 – Fran
合意...しかし、SMSサービスのユースケースが正常に処理されず、システムを停止させてはならない場合。サービスの監視、エラーと例外の処理、適切なロギングメカニズムにより、理解しやすく、デバッグし、修正する必要があります。ここで私が共有したのは、質問の周りを回るサンプルの例です。要件に基づいて外部サービスと統合するN種類の方法があり、ここではCQRSが最も適しています。私はあまりそれに精通していないので、それは私の心の中に来なかった。 –
- 1. Tomcat Containerにc3p0依存関係を置く場所
- 2. アプリケーションの外部にコンフィギュレーションファイルを置く場所
- 3. swffit、コードを置く場所は?
- 4. CakePHP 3 - カスタムSQLコードを置く場所
- 5. Ruby on rails3 javascriptコードを置く場所
- 6. ユーザーIDに依存する場所
- 7. PhantomJS外部依存
- 8. 外部依存で、
- 9. Yiiアプリケーション外部APIクラスを配置する場所
- 10. プロジェクトファイルを置く場所は?
- 11. 関係に依存する外部キー
- 12. 外部画像を保存する場所Intellij GWTプロジェクト
- 13. package.jsonにパッケージを入れる場所?依存関係または依存関係
- 14. Googleコード:ドキュメントを置く場所はどこですか?
- 15. .lower()をある場所に置くか別の場所に置くかの違いはありますか?
- 16. cellforrowatindexpathにdrawrectを置く場所は?
- 17. djangoにカスタムバリデーターを置く場所は?
- 18. EclipseにGitリポジトリを置く場所は?
- 19. ルーメンにビジネスロジックを置く場所は?
- 20. スタックプロジェクトの依存関係ソースコードの場所
- 21. マスターページのコードをMVCアプリケーションに配置する場所は?
- 22. mavenに依存するjarの場所を取得します
- 23. NodeJSブートストラップ依存関係の場所
- 24. Asp.netの依存関係注入場所
- 25. Android - ダウンロードしたコンテンツを保存する場所、内部ストレージと外部ストレージ
- 26. カスタムオープンキャレットエクステンションを置く場所
- 27. sdkファイルを置く場所
- 28. ViewModelを置く場所
- 29. 適切な場所にメソッド/コードを置く
- 30. 頻繁にチェックされるコードを置く場所はどこですか?
ユニットテストの実行中にSMSを送信しないでください。 –
これは漠然としていますが、通常はSMS Senderサービスがあります。このサービスはテストで嘲笑されます。 –
これはリポジトリパターンとは何が関係していますか? – Fran