クラス自体がinternalなときのUnitTest(.NET6版)

もくじ

目次(WPF/xaml/C#/C++関連メモ) - tera1707’s blog

やりたいこと

.NET6で作ったdllやexeの中のクラスやメソッドをUnitTestするときに、publicなクラスだけではなく、internalなクラスもUnitTestしたい。 で、以前.Net Frameworkでそういうことをしたときに、internalなクラスを外から呼ぶ方法を調べたのでそれをやろうとしたら、.NET6では、プロジェクトを作成したときに「AssenblyInfo.cs」が自動で作成されなくなっていたので、そのまんまの方法ではできなかった。

.NET6でも、同じことがしたい。

やりかた

外から見てほしいinternalなクラスを持っているプロジェクト(アセンブリ)に、自分で「AssenblyInfo.cs」を作成して、そこに[assembly: InternalsVisibleToAttribute("アセンブリ名")]を書いてやればよい。

やりかたサンプル

internalが外(別アセンブリ)から見れない状態

まずは、internalなクラスを外から見ようとしてみて、見れないことを確認する。
f:id:tera1707:20220129170350p:plain

internalなクラスを持つクラス(見られる側/dll)に、こういうクラスを作って、

namespace ClassLibrary1
{
    internal class InterlalClass
    {
        public int MyMethod() => 123;
    }
}

internalなクラスを呼びたいexe(見る側/exe)をこういうコードにすると、

var ic = new ClassLibrary1.InterlalClass();
Console.WriteLine(ic.MyMethod());

怒られる。

f:id:tera1707:20220129170802p:plain

internalが外(別アセンブリ)から見れるようにする

まず、見られたい側のプロジェクトに、"AssemblyInfo.cs"というファイルを作成する。

f:id:tera1707:20220129171158p:plain

その中身を全部削除して、下記のようにする。
("MainConsoleApp"は、見る側のアセンブリ名。このアセンブリからだけは、internalでも見えるようにしますよ、という感じ)

using System.Runtime.CompilerServices;
[assembly: InternalsVisibleToAttribute("MainConsoleApp")]

そうすると、呼ぶ側でも見えるようになる。

f:id:tera1707:20220129171913p:plain

備考

今回、 [assembly: InternalsVisibleToAttribute("MainConsoleApp")]を"AssemblyInfo.cs"を作ってそこに書いたが、 "AssemblyInfo.cs"を作らなくても、呼ばれたいアセンブリ(今回でいうとClassLibrary1プロジェクト)の中のほかのどこかに書けばOK。 (例えば、MyClass1.csの一番上とか。)

f:id:tera1707:20220129172330p:plain

また、「署名したアセンブリ」に対しては、ちょっと違う書き方をしないといけないっぽい。

今回は試してないので、MS公式を参照。

参考

MS公式。

docs.microsoft.com

参考にさせて頂いたサイト

www.nuits.jp

light11.hatenadiary.com