ホームページ > バックエンド開発 > C++ > 実行時エラーを回避しながら、C# でプライベート メソッドを効果的に単体テストするにはどうすればよいですか?

実行時エラーを回避しながら、C# でプライベート メソッドを効果的に単体テストするにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-18 21:38:10
オリジナル
281 人が閲覧しました

How Can I Effectively Unit Test Private Methods in C# While Avoiding Runtime Errors?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート