2016-09-12 19 views
0

ビジネスロジックのみをテストするためにマイユニットテストプロジェクト(NUnit)が作成されています。このロジックの大部分は私のビジネスロジックプロジェクトに含まれています。私はこのすべてを持つ別のDLLを持っています。私のアプリケーションは階層化されており、UI、サービスレイヤー、ビジネスロジック、データアクセスレイヤーのプロジェクトを持っています。ユニットテストプロジェクトからのプロジェクト参照

現在、UI参照Service.ServiceはBL、BL参照DAを参照しています。すべてのプロジェクトの参照を介して。

私はすべてのプロジェクトが参照する共有プロジェクトを持っています。 DTOオブジェクトといくつかの共有ENUMSといくつかのコードを保持しています。

私のデータアクセサでは、私はクラス "データベース"(例えば)があります。それは、データ操作メソッドの負荷を持っています...私はまた、同じプロジェクト内のインターフェイスIDatabaseを持っている人、更新人などを取得します。

私のテストプロジェクトでは、データベース呼び出しを模擬したいと思います。しかし、私のBLの私のコンストラクタは、データベースへの参照を持っているので、私はIoCを使用することができます。私の単体テストからそれを模擬できるようにするには、私はデータベースレイヤーへのプロジェクト参照が必要です。これは正常ですか?これは、コンストラクタに具体的なクラスを提供する必要があるIoCと呼び出しメソッドが原因です。

答えて

0

DBの関連インターフェイスをデータベースレイヤからBLに抽出し、実際の実装ではなくコンストラクタに挿入することで、これを解決できます。例えば、DBの代わりに別のレイヤー(他のDB、ファイル/外部サービスなど)をプラグインできるようにしたい場合、これは実際には推奨されます。これは、これらのインターフェースの別の実装を必要とするだけです(IUserQuerier - DbUserQuerier、FileUserQuerierなど)

+0

ありがとうございます。だからインターフェイスは本当に後で呼ばれるべきですか?それは後でサービスを後で呼び出すUIを持っていれば、そのインターフェースがUIの後にサービスのためにあることを示しているように見えるので、それはさらに奇妙に思えます。 – Craig

+0

いいえ、これはそうではありませんが、むしろ:DDD(ドメイン駆動型設計)の観点から考えると、ほとんどの私の_interfaces_を**ドメイン**に入れておきたいと思いますアプリの他のほとんどの部分(UIレイヤを含む)で参照されます。しかし、他の層(DBのようなもの)はIoCブートストラップ(Composition rootなど)によってのみ参照されることになりますが、それはかなり唯一のものになります。 –

関連する問題