2009-03-15 6 views
5

Au fur et à mesure que je développe du code, je veux souvent tester certains des blocs de construction d'une classe, même s'ils sont normalement privés. Si mes tests unitaires sont dans le projet, je peux utiliser "Friend" pour accomplir ceci et garder les fonctions privées pour un usage normal. Mais je préfère déplacer mes tests NUnit dans leurs propres projets séparés. Comment puis-je obtenir l'effet que je recherche?Comment tester unitairement des fonctions privées à partir d'un projet distinct dans VB .NET?

Répondre

11

Vous ne pouvez pas (facilement) Test privé des méthodes d'un autre projet, mais il est assez fréquent de tester internes méthodes (Friend en VB) d'un projet de test à l'aide InternalsVisibleToAttribute. Cela rend les membres Friend accessibles à un autre assembly.

Apparemment, c'était nouveau dans VB 9 bien qu'il était disponible en C# 2 ... pas très bien pourquoi, mais this blog post from Bart de Smet donne un exemple rapide.

Notez que si votre assembly de production est signé, votre assembly de test devra également être signé, et vous devrez spécifier la clé publique dans les arguments InternalsVisibleToAttribute. Voir this Stack Overflow answer pour plus de détails.

+2

Quant à savoir pourquoi il était nouveau dans VB9, il était un coût/profiter du compromis. VB a une façon très différente de résoudre les noms que C# et InternalsVisibleTo complique grandement la recherche de nom. Il était trop coûteux pour VB8 et est donc tombé à VB9. Nous sommes en train de faire d'autres changements autour de la résolution de noms pour (suite) – JaredPar

+0

(cont) en tenir compte dans VB10. – JaredPar

+0

merci pour cette réponse –

3

Vous pouvez utiliser Reflection pour appeler les méthodes privées. Il y a beaucoup d'échantillons là-bas pour le faire.

+0

Et c'est celui qui m'a le plus aidé: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx – demoncodemonkey

1

A partir d'une recherche rapide Google: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

Les bases: (ce qui est collé à partir du site du projet de code lié ci-dessus)

 public static object RunStaticMethod(System.Type t, string strMethod, 
    object [] objParams) 
    { 
     BindingFlags eFlags = 
     BindingFlags.Static | BindingFlags.Public | 
     BindingFlags.NonPublic; 
     return RunMethod(t, strMethod, 
     null, aobjParams, eFlags); 
    } //end of method 

    public static object RunInstanceMethod(System.Type t, string strMethod, 
    object objInstance, object [] aobjParams) 
    { 
     BindingFlags eFlags = BindingFlags.Instance | BindingFlags.Public | 
     BindingFlags.NonPublic; 
     return RunMethod(t, strMethod, 
     objInstance, aobjParams, eFlags); 
    } //end of method 

    private static object RunMethod(System.Type t, string 
    strMethod, object objInstance, object [] aobjParams, BindingFlags eFlags) 
    { 
     MethodInfo m; 
     try 
     { 
      m = t.GetMethod(strMethod, eFlags); 
      if (m == null) 
      { 
       throw new ArgumentException("There is no method '" + 
        strMethod + "' for type '" + t.ToString() + "'."); 
      } 

      object objRet = m.Invoke(objInstance, aobjParams); 
      return objRet; 
     } 
     catch 
     { 
      throw; 
     } 
    } //end of method 
Questions connexes