2009-03-15 19 views
5

A medida que desarrollo el código, a menudo quiero probar algunos de los componentes básicos de una clase, incluso si son normalmente privados. Si las pruebas de mi unidad están dentro del proyecto, puedo usar "Amigo" para lograr esto y aún así mantener las funciones privadas para el uso normal. Pero prefiero mover mis pruebas de NUnit a sus propios proyectos separados. ¿Cómo logro el efecto que estoy buscando?¿Cómo puedo probar las funciones privadas de un proyecto separado en VB .NET?

Respuesta

11

no se puede probar (fácilmente) privadas métodos de un proyecto diferente, pero es bastante común para probar métodos internos (Friend en VB) de un proyecto de prueba usando InternalsVisibleToAttribute. Esto hace que los miembros Friend sean accesibles para otro ensamblaje.

Al parecer, esto era nuevo en VB 9 aunque estaba disponible en C# 2 ... no estoy seguro por qué, pero this blog post from Bart de Smet da un ejemplo rápido.

Tenga en cuenta que si su ensamblaje de producción está firmado, su ensamblaje de prueba también deberá estar firmado, y deberá especificar la clave pública en los argumentos InternalsVisibleToAttribute. Vea this Stack Overflow answer para más detalles.

+2

cuanto a por qué era nuevo en VB9, que era un costo/beneficio de intercambio. VB tiene una manera muy diferente de resolver nombres que C# e InternalsVisibleTo complica mucho la búsqueda de nombres. Era demasiado costoso para VB8 y por lo tanto cayó a VB9. De hecho, estamos realizando cambios adicionales en la resolución de nombres a (cont) – JaredPar

+0

(cont) para esto en VB10. – JaredPar

+0

gracias por esta respuesta –

3

Puede usar Reflection para invocar los métodos privados. Hay muchas muestras para hacer esto.

+0

Y esta es la que más me ha ayudado: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx – demoncodemonkey

1

De una rápida búsqueda en Google: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

Los fundamentos: (esto se pega desde el sitio del proyecto de código vinculado anteriormente)

 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 
Cuestiones relacionadas