28

クラス「ClassB」に依存するクラス「ClassA」があるとします(ClassAのコンストラクターに注入されます)。ClassA を分離してテストできるように、ClassB をモックしたいと考えています。どちらのクラスも内部です。

私が間違っている場合は修正してください。ただし、Moq はクラスがパブリックであり、パラメーターのないパブリック コンストラクターがあり、モックされるメソッドがpublic virtual. これらのクラスを公開したくありません。Moq に何か足りないものがありますか、それとも私がやりたいことに適していないだけですか?

ClassB が実装するインターフェイス (「IClassB」など) を作成し、それを ClassA に挿入して、代わりにインターフェイスをモックできると思います。ClassB はまだ内部にすることができます (ただし、インターフェイス メソッドはパブリックにする必要があることは認識しています)。これは機能しますが、単体テストのモックをサポートすることのみを目的とした多くのインターフェイスを作成することに不安を感じています。考え?

4

2 に答える 2

69

InternalsVisibleToAttribute次のように、プロジェクトのassembly.csに追加することで、内部を Moq に表示することができます。

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

なぜ"DynamicProxyGenAssembly2"ではないの"Moq"ですか?これは、動的に生成されたプロキシ タイプを含めるために作成された動的アセンブリの名前です (これらはすべて、Moq によって使用されるさらに別のライブラリ、Castle の DynamicProxyによって処理されます)。したがって、型を Moq 自体ではなく、動的プロキシ アセンブリに公開します。

しかし、オーバーライド可能なメンバーがない場合、クラスをモックするポイントは何ですか? 何もモックせず、すべての呼び出しで実際の実装を使用します。あなたの2番目の解決策、

ClassB が実装するインターフェイス (「IClassB」など) を作成し、それを ClassA に挿入して、代わりにインターフェイスをモックできると思います。

私が通常行うことです。その目的は、 「単体テストのモックをサポートすること」以上のものです。疎結合コンポーネントを構築するのに役立ちます。これは、常に目指す価値のあるものです。

于 2013-07-10T15:04:38.467 に答える