2013-07-10 12 views
18

私はクラス "ClassA"(クラスAのctrに注入される)に依存する "ClassA"というクラスがあります。私はClassAを孤立してテストできるようにClassBを模擬したい。どちらのクラスも内部的です。ユニットテストのために内部クラスをMoqでモックする

もし私が間違っていればそれを修正しますが、Moqは公開されていればそれを模擬できるだけで、パブリックなパラメータのないコンストラクタを持っていて、模擬するメソッドはpublic virtualです。私は本当にこれらのクラスを公開したいとは思わない。私はMoqで何かを逃しているのですか?それとも、私がやりたいことに適していませんか?

私はClassBが実装しているインターフェイス(「IClassB」と言う)を作成してClassAに注入し、代わりにインターフェイスをモックすることができたと思います。 ClassBは依然として内部にあることができます(ただし、インタフェースメソッドは公開する必要があります)。これがうまくいく間、単体テスト・モックをサポートすることを目的とする多くのインターフェースを作成することには不安が感じられます。思考?

答えて

45

あなたはこのように、プロジェクトのassembly.csInternalsVisibleToAttributeを追加することによって、部品番号への内部が見えるようでした:

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

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

私はClassBが実装するインターフェイス(例えば、 "IClassB")を作成し、ClassAに注入し、代わりにインターフェイスを模擬することができたと思います。

は、通常どおりです。その目的は"ユニットテストの模擬をサポートする"以上です。これは、あなたが目指す価値のある、疎結合のコンポーネントを構築するのに役立ちます。

+0

おかげさまで、ありがとうございました。しかし、私は今クラスを公開することを決めました(少なくともテストされているもの)。私はすべてを社内にしようとしたときに掛かっていたと思うが、それは唯一のデスクトップアプリケーションなので、顧客に与えられていたアセンブリ/ APIのように重要ではない。 –

+0

非常に有用な投稿、私は非常にInternalsVisibleTo( "IntegrationTests")が動作していないと混乱していた。その後、それは私のアセンブリにアクセスするのではなく、城の動的に作成されたアセンブリであることが理にかなっていました。 –

関連する問題