Test de méthode privée C#
Pour obtenir une couverture complète du code, les méthodes privées doivent être testées. Une solution consiste à utiliser les classes d'accesseurs générées par Visual Studio. Cependant, cette approche peut rencontrer des erreurs d’exécution en raison d’une incompatibilité de type.
Considérez l'extrait de code suivant :
<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>
Question :
Le test unitaire de la méthode privée MyFunc échoue au moment de l'exécution avec l'erreur suivante :
<code>无法将类型为'System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]'的对象转换为类型为'System.Collections.Generic.List`1[MyProj.TypeA.TypeA+TypeB]'的对象。</code>
Cela est dû au fait que la classe accesseur génère différentes implémentations de myList avec différents paramètres de type.
Solution :
Dans les versions de .NET Core antérieures à 2.0, vous pouvez utiliser la classe PrivateObject pour appeler des méthodes privées :
<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>
Cependant, .NET Core 2.0 et versions ultérieures ont supprimé la prise en charge de PrivateObject et PrivateType. Dans ce cas, envisagez de refactoriser le code pour rendre les méthodes privées testables, ou adoptez une approche basée sur la réflexion.
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!