アクセス修飾子がinternalのクラスやメソッド(他のプロジェクトから参照できない)に対して、別のテストプロジェクトからユニットテストを行う方法を解説します。
この方法を用いることで、publicクラスと同じようにinternalクラスも手軽にテストすることができます。
環境
- Visual Studio 2022
- .NET 6
前提
サンプルプロジェクトを使いながら説明します。
現在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)
現在のアセンブリ内でのみ通常表示される型が、指定したアセンブリに対して表示されるように指定します。
learn.microsoft.com

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

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