C# でのプライベート メソッドの単体テストの課題
C# でのプライベート メソッドの単体テストは、カプセル化された性質のため、難しい場合があります。 Visual Studio は自動的に生成されたアクセサー クラスを提供しますが、テスト中にランタイム エラーが発生する可能性があります。
コード例とテストケース
次のコード スニペットとそれに対応するテストについて考えてみましょう:
<code class="language-csharp">// 被测试单元 class TypeA { private List<TypeB> myList = new List<TypeB>(); private void MyFunc() { /* 忽略处理过程 */ } } // 单元测试 public void MyFuncTest() { TypeA_Accessor target = new TypeA_Accessor(); target.myList.Add(new TypeA_Accessor.TypeB()); target.MyFunc(); }</code>
実行時エラー
コンパイルは成功しましたが、型変換の問題により実行時エラーが発生しました:
<code>无法将类型为 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]' 的对象转换为类型为 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA+TypeB]' 的对象。</code>
根本的な原因は、target
のタイプが TypeA_Accessor
であり、予期された TypeA
ではないことです。この不一致により、変換は失敗します。
解決策
.NET Core 2.0 より前
PrivateObject
クラスを使用してプライベート メソッドとフィールドにアクセスします。
<code class="language-csharp">PrivateObject target = new PrivateObject(new TypeA()); var retVal = target.Invoke("MyFunc");</code>
.NET Core 2.0 以降
PrivateObject
クラスはサポートされなくなりました。別の方法としては、テスト目的でプライベート メソッドを internal
に設定するか、プライベート メソッドをテストする必要性を避けるためにコードをリファクタリングすることを検討します。
以上が実行時エラーを回避しながら、C# でプライベート メソッドを効果的に単体テストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。