2013-03-15 4 views
48

私は複雑なオブジェクトを作成するクラスライブラリを作成したいと思いますが、可能な限りほとんど公開しないでください。私はそれを他のプロジェクトに含めることを望んでいます。そこにはこのライブラリへの呼び出しが1つしかありません。私は内部的に作成されたクラスのオブジェクトを返します。私は他人にこれらのオブジェクトを明示的に作成させたくないですが、このクラスライブラリ用のテストプロジェクトを作成したいと思っています。例えば内部クラスライブラリをテストするには?

var result = Manager.Instance.Create(definition) 

これは、クラスライブラリへのアクセスのみでなければなりません。

定義パラメータに基づいて、要求されたインスタンスを作成するために異なるサブクラスを使用し、それに応じてプロパティを設定します。それゆえ、私は、何らかの形でテストによって、作成プロセス全体がうまくいっていることを保証したいと思います。しかし、結果オブジェクトの内部プロパティもあまり公開したくないので、私はこのpublicアクセスメソッドを使用するだけではテストできません。なぜなら、私はアサートするプロパティがないからです。

私はあなたが内部力学のためにテストすべきではないことを知っています。それは通常悪い設計であり、私もthis articleを通して読んでいましたが、ライブラリプラスユニットテストプロジェクトを作成し、このクラスに?ラッパーや何かで?

+0

あなたはこのようにそれを使うのか? –

+0

重複:http://stackoverflow.com/q/358196/492 –

答えて

123

.NETでは、クラスライブラリ内でInternalsVisibleToAttributeを使用して、内部テストの種類をユニットテストプロジェクトに表示させることができます。

こうすれば、クラスを内部に保つことができ、引き続き他のアセンブリからアクセスして使用することができます。使用している言語

[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")] 
+0

それを知らなかった!ありがとうございました! –

+10

すばらしい解決策!いくつかの追加情報: 1)この[[assembly:...] '構文がベルを鳴らさない場合は、アセンブリアトリビュート(http://msdn.microsoft.com/en-us/library/4w8c1y2s)を参照してください。 aspx)であり、最もよく知られているものはAssemblyVersionAttributeとその兄弟です。 2)ネームスペース外のプロジェクトの.csファイルでこれらを使用できますが、通常は 'Properties'プロジェクトフォルダにある 'AssemblyInfo'ファイルで指定します。 3)これらの違いがある場合は、*名前空間*ではなく、プロジェクトの*名前*を実際に指定する必要があります。 –

+0

それはすごいです、私はこれを行うことができるとは考えていなかった、あなたは毎日何か新しいことを学ぶ! – MaYaN

関連する問題