単体テストでプライベート フィールドにアクセスすることは可能ですか?
6 に答える
プライベート フィールドまたはメソッドを取得する一般的な方法は、リフレクションを使用することです。ただし、単体テスト フレームワークには、PrivateObject
これを簡単にするためのヘルパー クラスが含まれています。ドキュメントを参照してください。一般に、これを使用すると、次のような拡張メソッドを作成することになりました。
public static int GetPrivateField(this MyObject obj)
{
PrivateObject po = new PrivateObject(obj);
return (int)po.GetField("_privateIntField");
}
ただし、静的クラスでプライベート フィールドを取得する必要がある場合は、そのままリフレクションを使用する必要があります。
上記で提供された素敵なソリューション。完全を期すために、私はしばらくの間 (MSTest を使用して) この手法を使用してきましたが、プロパティ値にも拡張しました。
[ExcludeFromCodeCoverage]
public static class TestExtensionMethods
{
public static T GetFieldValue<T>(this object sut, string name)
{
var field = sut
.GetType()
.GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
return (T)field?.GetValue(sut);
}
public static T GetPropertyValue<T>(this object sut, string name)
{
var field = sut
.GetType()
.GetProperty(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
return (T)field?.GetValue(sut);
}
}
いいえ。優れた単体テストを作成している場合は、プライベートフィールドにアクセスする必要はありません。単体テストでは、既知の値のセットで渡されたときに、メソッドが特定の方法で動作することをテストする必要があります(適切なデータを返すか、既知の方法で依存関係を使用します)。
後でテストする場合は、依存性注入を使用して、テストするクラスに依存性を注入します。テストでは、これらの依存関係に完全にアクセスできます。
良いアイデアだとは言いませんが、InternalsVisibleTo が使用されているのを見てきました。
この Q を見てください。あまり人気のない回答の 1 つ: