Core アセンブリが特定のクラスを公開しないようにしたいのですが、それでもテストできるようにしたいと考えています。どうやってやるの ?
5 に答える
InternalsVisibleTo属性が助けになります!
追加するだけです:
[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]
Core クラスの AssemblyInfo.cs ファイルに
ベスト プラクティスについては、フレンド アセンブリ (C# プログラミング ガイド)を参照してください。
アセンブリに厳密な名前が付けられている場合、InternalsVisible を使用して、公開キーを指定する必要があります (注:公開キー トークンではなく完全なキー)。
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("BoardEx_BusinessObjects.Tests,
PublicKey=0024000004800000940000000602000000240000525341310004000001000100fb3a2d8 etc etc")]
次のトリックは、コマンドラインに頼らずに公開鍵を取得するのに非常に役立ちます...
http://www.andrewconnell.com/blog/archive/2006/09/15/4587.aspx
単体テストを、テスト対象のコードと同じアセンブリに配置しました。「自分自身をテストする」ことは、「自分自身を初期化する」や「自分自身を説明する」などと同様に、クラスの機能と考えているため、これは私には理にかなっています。
このアプローチに対する反論をいくつか聞いたことがありますが、説得力のあるものはほとんどありません。
それはパフォーマンスを損ないます。ハードデータなしで最適化しないでください! おそらく、低速リンクを介してアセンブリをダウンロードすることを計画している場合は、アセンブリのサイズを最小限に抑えることをお勧めします。
これはセキュリティ上のリスクです。テストにシークレットがある場合のみ。そうしないでください。
さて、あなたの状況は私の状況とは異なります。あなたは自分でそれを理解する必要があります。
余談: C# では、テスト対象のクラス内にネストされた "Tests" という名前のクラスに単体テストを配置しようとしたことがあります。これにより、物事の正しい編成が明らかになりました。また、クラス「Foo」のテストが「FooTests」というクラスにあるときに発生する名前の重複も回避されました。しかし、私がアクセスした単体テスト フレームワークは、「公開」とマークされていないテストの受け入れを拒否しました。これは、テストしているクラスを「プライベート」にすることはできないことを意味します。テストを「パブリック」にする必要がある正当な理由は思いつきません。なぜなら、テストをパブリック メソッドとして実際に呼び出す人はいないからです。すべてはリフレクションによって行われます。.Net の単体テスト フレームワークを作成する場合は、非公開テストを許可することを検討してください。
このようなトラブルに巻き込まれないことをお勧めします...「内部」クラスを本当に単体テストしたい場合は、内部コードのみが使用する名前空間にそれらを隠してください。.NET フレームワークの規模でフレームワークを作成している場合を除き、そのレベルの隠蔽は実際には必要ありません。
リフレクションを使用することも (MS テスト項目と同様)、単体テスト アセンブリをコア アセンブリのフレンドとして宣言することもできます。
もう 1 つのオプションは、単体テストを同じアセンブリに配置することです。