BobさんのブログとTSS id DEADの記事を読んだ後、もう少しテストをしたいと思っていました。DDD - ApplicationServices単体テスト
私のアプリケーションはレイヤーを使用しています:ApplicationService - > Model - > Support。
アプリケーションサービスはユースケースを定義します。これは少し手続き型のコードです(loadX、X.doSomething、saveXを呼び出します)。場合によっては、appServiceクラスには多くの外部依存関係が必要です。例えば
、Iは「ワークフロー」の終了時に使用されるオブジェクト「D」を有します。だから、それを使って作業するとき、私はこのオブジェクトにリンクされているオブジェクト "A"/"B"/"C"に関するいくつかのルールをチェックする必要があります。 3つのエンティティがそれぞれ独自のリポジトリに関連付けられており、非常に特殊なケースでは、別のルールを深く(「AA」==別のリポジトリのように)チェックする必要があります。
私appServiceは8〜10の依存関係(5つのリポジトリ+いくつかのビジネス・サービス間のエンティティ)のようなものを持っています。私の "義務"ではないテスト。私はあまりにも多くのサービスを嘲笑するとき、勇気が足りません。各サービスに3つのメソッドがありますが、私のappServiceに必要なメソッドが1つだけの場合は、すべてのメソッドを模擬したり模擬したりする方法を知っている必要があります(無駄なメソッドの2/3をモック/スタブします)。
私は多くの問題があると思います。私の最初のものはあまりにも多くの依存関係です。私は依存関係を分割してカーペットの下に隠したくないだけです。悪い境界、あまりにも多くの分離など
article (uncle bob)を読んだ後、私は間違っていると思っていました。おそらくappServiceは、必要なものとのインタフェースを表現/宣言する必要があります。しかし、それをどのように名付けますか?それを分割する方法は?私は関連するサービスを一緒に置くことはお勧めできません。ファサードのようなものを書くとテストがより簡単になります(私のクラスは、これらの外部サービスと結びついていて、どれが正確に分かっているのか分かります)。
- どのようにあなたのappServicesをテストするのですか?
- 注入されたサービス(「ファサード」のようなものか、より多くのビジネスや何か他のもの)を分割することは良いアプローチですか?
おかげ
アップデート1(2016年6月23日):exempleのために、ここではアプリケーション・サービス・クラスのための DPAppServiceその依存関係のリスト:非常に迷惑、
DPRepository dpRepository;
RechercheFournisseurQueryService rechercheFournisseur;
RechercheFactureQueryService rechercheFacture;
DateService dateService;
SFRepository sfRepository;
CommandeRepository commandeRepository;
RepartitionBudgetRepository repartRepo;
GenerateurRepartitionsDPService genRepartDpService;
SaisieRepartitionsSurDpQueryService saisieRepartitionsSurDpQueryService;
ImputationBudgetaireService imputationBudgetaireService;
NomenclatureService nomenclatureService;
ComptaGeneraleService comptaGeneraleService;
OperationInfoService operationInfoService;
DemandePaiementCalculateurService dpCalculateurService;
CodeMarcheAnnualiseRepository codeMarcheAnnualiseRepository;
DemandePaiementLigneFactory dpLigneFactory;
EcritureRepository ecritureRepository;
BrouillardNonViseRepository brouillardNonViseRepository;
かなり怖いですコンストラクタ注入を使用して注入する。リポジトリにはいくつかのリポジトリがあります(あまりにも多く、私は思っており、DPサービスはリポジトリによって公開されているメソッドのサブセットしか必要としません)、いくつかのサービス(現時点では自分のドメインで実際には保持できない計算)
ドメインについてもう少し説明する必要があります。 このクラスは、 "DP"コンセプトに付けられたすべてのユースケース(20のメソッド、いくつかのメソッドが別のメソッドと異なるだけのもの)を担当します。コンセプトは、「ワークフロー」(ここでは緩い使用される用語)の終わりにされています
- 最初のユーザーは「EJ」
- を作成し、その後、彼は「SF」
- が、その後、彼は「骨折」を作成し、作成します
- 最終的に、プリビジュアルオブジェクトをバインドするDPを作成するので、プリビジュアルオブジェクトの使用状況を確認/ロードする必要があります。 DPは本当にすべてのプリビジュアルオブジェクトを保持することはできません(ビットが多すぎます)。
アイデア:
- 私は、依存関係の数を制限するために(サブ機能ごとに、ネストされたパッケージを作成する)ユースケースを分割することができます。
- 私は、モデルをリファクタリングすることができます
- それが必要とインタフェースを
どれ長所/短所/アイデア(私は叔父ボブからのTDD /少しアーキテクチャについての私のlectrues後にこのアイデアを調査していた)を提供することができますクラス?
あなたの時間/お答えいただきありがとうございます。
おそらく多くの依存関係を持つアプリケーションサービスそれが提供するサービスが非常に粘着的ではなく、おそらくあまりにも多くのことをしていることを意味します。あなたは、そのサービスのインターフェースと少なくともあなたが正しい方向を示すようにするために必要な依存関係の例を挙げるべきです。もう1つは、サービスの数を減らすためにできることは、いくつかの依存関係をグループ化し、当初はアプリケーションサービスに直接関わっていたいくつかの操作を運ぶ新しい結束概念を見つけることだと思います。 – plalx
+1、このサービスは間違いなく膨らんだようです。あなたのビジネスドメインに高レベルの「ワークフロー」を形成するアクティビティがいくつかあるため、一般的にそのすべてが同じアプリケーションサービス内にある必要はありません。アプリケーションサービスは通常、集約に沿っています。 – guillaume31