internalなクラスやメソッドに対して、別のテストプロジェクトからユニットテストを行う方法について調べたのでまとめます。
この方法を用いることで、publicクラスと同じようにinternalクラスも手軽にテストすることができます。
環境
- Visual Studio Community 2022 Version 17.0.2
- .NET 6
- Windows10
前提
サンプルプロジェクトを使いながら説明します。
現在2つのプロジェクトがあり、「InternalTestSample」がテスト対象のプロジェクトで、「Tests」が単体テストプロジェクトです。

まずテスト対象となるCalculatorクラスです。足し算を行うのシンプルなメソッドがあり、アクセス修飾子はinternalにしています。
internal class Calculator
{
internal int Add(int x, int y)
{
return x + y;
}
}
次にCalculatorクラスのテストを行うCalculatorTestクラスです。
テストフレームワークにはxUnitを使っていますが、MSTestやNUnitでも問題ありません。
using Xunit;
namespace Tests
{
public class CalculatorTest
{
[Fact]
public void AddTest()
{
var calculator = new Calculator();
Assert.Equal(4, calculator.Add(1, 3));
}
}
}
現状ではCalcuratorとCalcuratorTestクラスのアセンブリ(プロジェクト)が異なるので、以下のように「アクセスできない保護レベルになっています」というコンパイルエラーが出ます。

解決方法
「InternalTestSample」 プロジェクト内の任意のファイルに以下の2行のコードを記載することで、テストプロジェクトに対してのみinternalクラスを公開することができます。
今回はわかりやすさ重視のため、Calculator.cs内にコードを追加しています。
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Tests")]
internal class Calculator
{
internal int Add(int x, int y)
{
return x + y;
}
}
これで無事にエラーが消え、internalクラスに対してもテストが実行できるようになりました。
参考

InternalsVisibleToAttribute クラス (System.Runtime.CompilerServices)
通常は現在のアセンブリ内でのみ参照できる型が、指定したアセンブリから参照可能であることを指定します。

【C#】internalクラスに対してテストコードを書く方法 - Qiita
はじめに internalクラスに対してテストコードを書こうとした場合、アクセス制限に引っかかりテストコードが書けない。 この記事ではその場合の解決方法をまとめる。 現象 あるプロジェクトで以下のようなコードがあったとしよ...

.NET StandardプロジェクトでInternalsVisibleToを設定する方法 - nuits.jp blog
.NETには、例えばinternalなクラスやメソッドのUnitTestをUnitTestプロジェクトから呼び出す仕組みとして、「InternalsVisibleTo」という属性があります。 従来の.NET Frameworkプロジェクトでは、プロジェクト作成時にPropertiesの下にAssemblyInfo.cs...
コメント