C# プライベート メソッド テスト
完全なコード カバレッジを実現するには、プライベート メソッドをテストする必要があります。 1 つの方法は、Visual Studio によって生成されたアクセサー クラスを使用することです。ただし、この方法では、型の不一致により実行時エラーが発生する可能性があります。
次のコード スニペットを考えてみましょう:
<code class="language-csharp">// 在MyProj项目中 class TypeA { private List<TypeB> myList = new List<TypeB>(); private class TypeB { public TypeB() { } } public TypeA() { } private void MyFunc() { // 更改实例状态的myList处理 } }</code>
質問:
プライベート メソッド MyFunc の単体テストが実行時に次のエラーで失敗します:
<code>无法将类型为'System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]'的对象转换为类型为'System.Collections.Generic.List`1[MyProj.TypeA.TypeA+TypeB]'的对象。</code>
これは、アクセサー クラスが、異なる型パラメーターを使用して myList の異なる実装を生成するためです。
解決策:
2.0 より前のバージョンの .NET Core では、PrivateObject クラスを使用してプライベート メソッドを呼び出すことができます。
<code class="language-csharp">// 在TestMyProj项目中 public void MyFuncTest() { TypeA target = new TypeA(); PrivateObject obj = new PrivateObject(target); // 下一行不会抛出异常 obj.Invoke("myList", new object[] { new TypeA_Accessor.TypeB() }); obj.Invoke("MyFunc"); // 检查target的更改状态 }</code>
ただし、.NET Core 2.0 以降では、PrivateObject と PrivateType のサポートが削除されました。この場合、コードをリファクタリングしてプライベート メソッドをテスト可能にするか、リフレクション ベースのアプローチを採用することを検討してください。
以上が型の不一致に直面した場合、C# でプライベート メソッドを効果的にテストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。