私はJavaから来ており、C#はかなり新しいので、正しい用語を使用しない場合や「javaっぽい」と思っている場合に備えて、ご容赦ください。
状況
私は、いくつかのリモートサービスからのデータを消費するためのファサードを提供するパッケージ(同じ名前空間内のすべてのクラス)に取り組んでいます。ファサードごとに、インターフェース(のようなIEventServiceGateway
)と実装(のようなEventServiceGateway
)があり、すべてが宣言されてpublic
います。これらの各実装は、少なくとも1つのサービスからのデータを消費しますが、すべて少し冗長なので、UserServiceClient
すべての実装に共通の操作を提供するクライアントクラス(のような)を作成しました。パッケージの外部の誰もそれらを使用するべきではないので、私はそれらを宣言しましたinternal
。さらに、WCFプロキシでも同じことをしました。
2つのアセンブリがあります。1つはファサードとクライアント用で、もう1つは単体テスト用です。両方の名前空間は同じです。
問題
- 内部クラスは単体テストを含むアセンブリでアクセスできないため、単体テストを実行できません。これらの制限を回避するための「ハック」があることは知っていますが、そのようなハックを使用することは、通常、想定外のものを使用していることを意味します。ファサードをテストするだけではコードパスが非常に複雑になるため、クライアントをテストしないことは賢明な解決策のようには思えません。さらに、エッジケースのような同じことを何度もテストします。
- 引数の可視性はコンストラクターの可視性よりも「低い」ため、コンストラクターインジェクションを使用して内部クラスをファサードに注入することはできません。ただし、WCFプロキシをハードコーディングすると、テスト容易性が低下します。
ですから、ファサードのことを完全に誤解したために(ファサードとその実装のみにアクセスできる必要があり、他には何もありません)、プロジェクトのセットアップに欠陥があるか、他の何かが間違っているために、私のデザインが壊れているように感じます。
誰かが私を教えてくれたら幸いです。