アセンブリ(単体テスト)が別のアセンブリの内部プロパティにアクセスできるようにするにはどうすればよいですか?


80

コアアセンブリで特定のクラスを公開しないようにしたいのですが、それでもテストできるようにしたいと思います。どうやってやるの ?

回答:


107

InternalsVisibleToはレスキューに起因します!

追加するだけです:

[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]

コアクラスAssemblyInfo.csファイルに

ベストプラクティスについては、フレンドアセンブリ(C#プログラミングガイド)を参照してください。


3
akuがリンクしているガイダンスに従って、強力な名前付きアセンブリを使用してこれを正常に実行しました。しかし、私には1つの問題がありました。すべてを構成した後、Intellisenseを機能させるためにVisualStudioを再起動する必要がありました。再起動する前にコンパイルされますが、常に赤い線が表示されます。
Eric Sc​​hoonover

20

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


9

単体テストを、テストしているコードと同じアセンブリに配置しました。これは私には理にかなっています。なぜなら、「自分自身をテストする」ことは、「自分自身を初期化する」や「自分自身を説明する」などのこととともに、クラスの機能として考えるからです。

このアプローチに対するいくつかの反対意見を聞いたことがありますが、説得力のあるものはほとんどありません。

それはパフォーマンスを傷つけますバー、私は言います!ハードデータなしで最適化しないでください!おそらく、アセンブリを低速リンク経由でダウンロードすることを計画している場合は、アセンブリサイズを最小化する価値があります。

これはセキュリティリスクです。テストに秘密がある場合のみ。そうしないでください。

さて、あなたの状況は私のものとは違うので、多分それはあなたにとって理にかなっているでしょう、そして多分それはそうではないでしょう。あなたはそれを自分で理解する必要があります。

余談ですが、C#では、テスト対象のクラス内にネストされた「Tests」という名前のクラスに単体テストを配置しようとしたことがあります。これにより、物事の正しい編成が明らかになりました。また、クラス「Foo」のテストが「FooTests」というクラスにあるときに発生する名前の重複を回避しました。しかし、私がアクセスした単体テストフレームワークは、「公開」とマークされていないテストを受け入れることを拒否しました。これは、テストしているクラスを「プライベート」にすることはできないことを意味します。テストを「パブリック」にする必要がある理由は考えられません。なぜなら、テストをパブリックメソッドと呼ぶ人は誰もいないからです。すべてはリフレクションによるものです。.Netの単体テストフレームワークを作成する場合は、私のために、非公開テストを許可することを検討してください。


5
興味深いアプローチ。そして、私はテストが公開されることに完全に同意します。愚かな要件、IMO。
Kilhoffer 2011

@Kilhoffer:私は何年もの間それについて不平を言ってきました、そしてあなたは私に本当に同意する最初の人です。ありがとう!
ジェイバズジ2011

6
[Conditional("DEBUG")]テストクラスで使用する場合は、それらを本番アセンブリに含めたり、パフォーマンスを低下させたりしないでください。
xmedeko 2015年

3

私はそのようなトラブルに行かないことをお勧めします...本当に「内部」クラスをユニットテストしたい場合は、内部コードだけが使用する名前空間にそれらを隠すだけです。.NET Frameworkの規模でフレームワークを作成しているのでない限り、そのレベルの非表示は実際には必要ありませ


一番下のコメントに気づいたとき、あなたが言ったことを正確にコメントするつもりでした。+1!:)
ビョルンレペン2008

2

リフレクションを使用することも(MSテスト項目のように)、単体テストアセンブリをコアアセンブリのフレンドとして宣言することもできます。

もう1つのオプションは、ユニットテストを同じアセンブリに配置することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.