C# でのプライベートメソッドの単体テスト 質問する

C# でのプライベートメソッドの単体テスト 質問する

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);

PrivateObjectPrivateType.NET Core 2.0 ではサポートが削除されました。

おすすめ記事