Défis des tests unitaires de méthodes privées en C#
Les tests unitaires des méthodes privées en C# peuvent être délicats en raison de leur nature encapsulée. Bien que Visual Studio fournisse des classes d'accesseurs générées automatiquement, des erreurs d'exécution peuvent toujours se produire lors des tests.
Exemples de code et cas de test
Considérez l'extrait de code suivant et le test correspondant :
<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>
Erreur d'exécution
Compilation réussie, mais erreur d'exécution due à un problème de conversion de type :
<code>无法将类型为 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]' 的对象转换为类型为 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA+TypeB]' 的对象。</code>
La cause fondamentale est que target
est du type TypeA_Accessor
, pas du TypeA
attendu. Cette incompatibilité entraîne l'échec de la conversion.
Solution
Avant .NET Core 2.0
Utilisez la classe PrivateObject
pour accéder aux méthodes et champs privés :
<code class="language-csharp">PrivateObject target = new PrivateObject(new TypeA()); var retVal = target.Invoke("MyFunc");</code>
.NET Core 2.0 et supérieur
La classePrivateObject
n'est plus supportée. L'alternative consiste à définir la méthode privée sur internal
à des fins de test, ou à envisager de refactoriser le code pour éviter d'avoir à tester la méthode privée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!