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