2009-03-15 8 views
5

Wie ich Code entwickeln, möchte ich oft zu Unit-Test einige der Bausteine ​​einer Klasse, auch wenn sie in der Regel privat sind. Wenn sich meine Komponententests innerhalb des Projekts befinden, kann ich "Freund" verwenden, um dies zu erreichen, und die Funktionen dennoch für den normalen Gebrauch privat halten. Aber ich würde lieber meine NUnit-Tests in eigene Projekte verschieben. Wie erreiche ich den gewünschten Effekt?Wie kann ich private Funktionen aus einem separaten Projekt in VB .NET testen?

Antwort

11

Sie können nicht (leicht) Test private Methoden aus einem anderen Projekt, aber es ist durchaus üblich interne Methoden (Friend in VB) von einem Testprojekt InternalsVisibleToAttribute mit zu testen. Dies macht Friend Mitglieder für eine andere Baugruppe zugänglich.

Anscheinend war dies in VB 9 neu, obwohl es in C# 2 verfügbar war ... nicht ganz sicher warum, aber this blog post from Bart de Smet gibt ein schnelles Beispiel.

Beachten Sie, dass Ihre Testassembly auch signiert sein muss, wenn Ihre Produktionsassembly signiert ist, und Sie müssen den öffentlichen Schlüssel in den Argumenten InternalsVisibleToAttribute angeben. Weitere Informationen finden Sie unter this Stack Overflow answer.

+2

Wie, warum es war neu in VB9, war es ein Kosten/Nutzen ausgleichen. VB hat eine ganz andere Art und Weise Namen der Lösung als C# und InternalsVisibleTo sehr viel Namenssuche erschwert. Es war zu teuer für VB8 und fiel daher auf VB9. Wir machen eigentlich weitere Änderungen rund um die Namensauflösung (Fortsetzung) – JaredPar

+0

(Fortsetzung) entfallen diese in VB10. – JaredPar

+0

Dank für diese Antwort –

3

können Sie Reflexion verwenden, um die privaten Methoden aufzurufen. Es gibt viele Beispiele dafür.

+0

Und das ist derjenige, der mich am meisten geholfen: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx – demoncodemonkey

1

Von einer schnellen Google-Suche: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

Die Grundlagen: (dies aus der Code Projektseite oben verlinkten eingefügt wird)

 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 
Verwandte Themen