2008-12-11 9 views
284

Soy nuevo en las pruebas unitarias y estoy tratando de averiguar si debo comenzar a usar más modificador de acceso 'interno'. Sé que si usamos 'interno' y establecemos la variable de ensamblaje 'InternalsVisibleTo', podemos probar funciones que no queremos declarar públicas del proyecto de prueba. Esto me hace pensar que siempre debería usar 'interno' porque al menos cada proyecto (¿debería?) Tiene su propio proyecto de prueba. ¿Pueden decirme una razón por la que no debería hacer esto? ¿Cuándo debería usar 'privado'?Modificador de acceso "interno" C# cuando se realizan pruebas de unidades

+0

Vale la pena mencionar: a menudo puede evitar la necesidad de probar sus métodos internos con 'System.Diagnostics.Debug.Assert()' dentro de los métodos mismos. –

Respuesta

867

clases internas tienen que ser probado y no es un atributo assemby:

using System.Runtime.CompilerServices; 

[assembly:InternalsVisibleTo("MyTests")] 

Esto, unido al archivo de información del proyecto, por ejemplo, Properties\AssemblyInfo.cs.

+2

¿Lo agrego al proyecto de prueba o al proyecto bajo prueba!?!? – akuhn

+53

Agréguelo al proyecto bajo prueba (por ejemplo, en Propiedades \ AssemblyInfo.cs). "MyTests" sería el ensamblaje de prueba. – EricSchaefer

+78

Esto realmente debería ser la respuesta aceptada. No sé ustedes chicos, pero cuando las pruebas están "demasiado lejos" del código que están probando, tiendo a ponerme nervioso. Estoy a favor de evitar probar cualquier cosa marcada como 'privada ', pero demasiadas cosas' privadas 'podrían indicar una clase' interna 'que está luchando por ser extraída. TDD o sin TDD, prefiero tener más pruebas que prueben una gran cantidad de código, que tener pocas pruebas que ejerzan la misma cantidad de código. Y evitar probar cosas 'internas' no ayuda exactamente a lograr una buena proporción. –

8

Puede utilizar privado también y puede llamar a métodos privados con reflexión. Si está usando Visual Studio Team Suite, tiene algunas buenas funcionalidades que generarán un proxy para llamar a sus métodos privados por usted. Aquí está un artículo del proyecto de código que muestra cómo se puede hacer el trabajo usted mismo para poner a prueba la unidad de métodos privados y protegidos:

http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

En términos de los cuales acceden modificador se debe utilizar, mi regla general es empezar con privada y escalar según sea necesario. De esta forma expondrá la menor cantidad de detalles internos de su clase que realmente se necesitan y ayudará a mantener ocultos los detalles de la implementación, como deberían ser.

93

Si desea probar métodos privados, eche un vistazo a PrivateObject y PrivateType en el espacio de nombres Microsoft.VisualStudio.TestTools.UnitTesting. Ofrecen envoltorios fáciles de usar alrededor del código de reflexión necesario.

Docs: PrivateType, PrivateObject

+6

Cuando baje la votación por favor deje un comentario. Gracias. –

+26

Es estúpido votar esta respuesta. Apunta a una nueva solución y una muy buena que no se mencionó anteriormente. –

8

seguir usando privados por defecto. Si un miembro no debe exponerse más allá de ese tipo, no debe exponerse más allá de ese tipo, incluso dentro del mismo proyecto. Esto mantiene las cosas más seguras y ordenadas: cuando utilizas el objeto, queda más claro qué métodos debes usar.

Habiendo dicho eso, creo que es razonable hacer que los métodos naturistas sean internos para propósitos de prueba a veces. Prefiero eso al uso de la reflexión, que es refactorizado, antipático.

Una cosa a considerar podría ser un sufijo "ForTest":

internal void DoThisForTest(string name) 
{ 
    DoThis(name); 
} 

private void DoThis(string name) 
{ 
    // Real implementation 
} 

Luego, cuando se está utilizando la clase dentro del mismo proyecto, es obvio (ahora y en el futuro) que no se debe realmente use este método, solo está ahí para fines de prueba. Esto es un poco hacky, y no es algo que hago yo mismo, pero al menos vale la pena considerarlo.

+1

Si el método es interno, ¿esto no impide su uso del ensamblaje de prueba? –

+0

@Ralph: No se usa InternalsVisibleTo. –

+3

De vez en cuando uso el enfoque 'ForTest' pero siempre me parece feo (agregando código que no proporciona ningún valor real en términos de lógica de negocio de producción). Usualmente encuentro que tengo que usar el enfoque porque el diseño es algo desafortunado (es decirtener que restablecer las instancias de singleton entre las pruebas) – ChrisWue

Cuestiones relacionadas