Herausforderungen beim Unit-Testen privater Methoden in C#
Unit-Tests privater Methoden in C# können aufgrund ihrer gekapselten Natur schwierig sein. Obwohl Visual Studio automatisch generierte Zugriffsklassen bereitstellt, können beim Testen dennoch Laufzeitfehler auftreten.
Codebeispiele und Testfälle
Betrachten Sie den folgenden Codeausschnitt und den entsprechenden Test:
<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>
Laufzeitfehler
Kompilierung erfolgreich, aber Laufzeitfehler aufgrund eines Typkonvertierungsproblems:
<code>无法将类型为 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]' 的对象转换为类型为 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA+TypeB]' 的对象。</code>
Die Hauptursache ist, dass target
vom Typ TypeA_Accessor
ist, nicht vom erwarteten TypeA
. Diese Nichtübereinstimmung führt dazu, dass die Konvertierung fehlschlägt.
Lösung
Vor .NET Core 2.0
Verwenden Sie die Klasse PrivateObject
, um auf private Methoden und Felder zuzugreifen:
<code class="language-csharp">PrivateObject target = new PrivateObject(new TypeA()); var retVal = target.Invoke("MyFunc");</code>
.NET Core 2.0 und höher
Die KlassePrivateObject
wird nicht mehr unterstützt. Die Alternative besteht darin, die private Methode zu Testzwecken auf internal
zu setzen oder eine Umgestaltung des Codes in Betracht zu ziehen, um zu vermeiden, dass die private Methode getestet werden muss.
Das obige ist der detaillierte Inhalt vonWie kann ich private Methoden in C# effektiv Unit-Tests unter Vermeidung von Laufzeitfehlern durchführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!