Visual Studio では、自動的に生成されたアクセサー クラスを介してプライベート メソッドの単体テストを実行できます。コンパイルは成功するものの、実行時に失敗するプライベート メソッドのテストを作成しました。コードとテストの非常に最小限のバージョンは次のとおりです。
//in project MyProj
class TypeA
{
private List<TypeB> myList = new List<TypeB>();
private class TypeB
{
public TypeB()
{
}
}
public TypeA()
{
}
private void MyFunc()
{
//processing of myList that changes state of instance
}
}
//in project TestMyProj
public void MyFuncTest()
{
TypeA_Accessor target = new TypeA_Accessor();
//following line is the one that throws exception
target.myList.Add(new TypeA_Accessor.TypeB());
target.MyFunc();
//check changed state of target
}
ランタイムエラーは次のとおりです:
Object of type System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]' cannot be converted to type 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA+TypeB]'.
インテリセンスによると、つまりコンパイラによると、ターゲットは TypeA_Accessor 型です。しかし、実行時には TypeA 型であるため、リストの追加は失敗します。
このエラーを止める方法はありますか? あるいは、おそらくもっと可能性が高いのは、他の人が他にどのようなアドバイスをしているかです (おそらく「プライベート メソッドをテストしない」と「ユニット テストでオブジェクトの状態を操作しない」と予測します)。
ベストアンサー1
.NET Core 2.0より前のバージョンを使用している場合は、PrivateObject
クラス:
Class target = new Class();
PrivateObject obj = new PrivateObject(target);
var retVal = obj.Invoke("PrivateMethod");
Assert.AreEqual(expectedVal, retVal);