プログラミングを行っている際に外部公開の必要のないフィールド、プロパティ、メソッドなどには通常、不要なアクセスを制限するように必要最低限のアクセス修飾子を設定するかと思います。
単体テストをコーディングしていると、どうしても気になってしまうのが内部利用しているメソッドに対しての単体テストになります。 特にカバレッジの取得を行っているようなケースでは、どうしてもアクセスしたいメソッドなどが発生する場合があります。
限定的な範囲で公開したいような場合のアクセス修飾子として、同一アセンブリ内での公開を許可するinternalやFriendなどを利用することができますが、単体テストは実運用で利用されるプログラムとは異なるため、同一アセンブリではなく外部プロジェクトとして構成する場合が多いと思います。 つまり、internalやFriendを使ってもアクセスすることができなくなります。
このような場合に利用できるのがアセンブリ属性であるInternalsVisibleToになります。InternalsVisibleTo属性を利用すると、特定のアセンブリのみ同一アセンブリのクラスと同様にinternal(Friend)メンバに対してアクセスができるようになります。
それでは、その方法について具体的に見ていきましょう。
たとえば以下のようなクラスがあった場合、
1: namespace SampleTestLib
2: {
3: public class Class1
4: {
5: internal int Add(int x, int y)
6: {
7: return x + y;
8: }
9: }
10: }
当然、同一アセンブリ内のクラスからはAddメソッドにアクセスすることができますが、異なるアセンブリからはアクセスできません。
そこで、以下の手順でアセンブリ属性InternalsVisibleToを追加します。つまり、アセンブリレベルで適用される属性なので、ソースコードの先頭やAssemblyInfoファイル内で定義することができます。
ここではAssemblyInfo内に定義したいと思います。
ソリューションエクスプローラーから「Properties」を開き、中もあるAssemblyInfo.csを開きます。
プロジェクトのAssemblyInfo内に以下の属性を追加します。
1: // 公開先のアセンブリを指定する
2: // [assembly: InternalsVisibleTo("公開先のアセンブリ名")]
3: [assembly: InternalsVisibleTo("SampleTestLibTest")]
これらはSystem.Runtime.CompilerServices名前空間にある属性のため、VBなどではImportsを忘れずに!
プロジェクトで単体テストを作成する際によく利用する属性なのですが、いつも大体コピペで済むこともあって、忘れることが多いので一応忘備録代わりに(^^;
InternalsVisibleToAttribute クラス
