Soy nuevo en pruebas unitarias y estoy tratando de averiguar si debo comenzar a usar más modificadores de acceso 'internos'. Sé que si usamos 'interno' y configuramos la variable de ensamblaje 'InternalsVisibleTo', podemos probar funciones que no queremos declarar públicas desde el 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 debo usar 'privado'?
c#
.net
unit-testing
tdd
Hertanto Lie
fuente
fuente
System.Diagnostics.Debug.Assert()
dentro de los mismos métodos.Respuestas:
Las clases internas deben probarse y hay un atributo de ensamblaje:
Agregue esto al archivo de información del proyecto, por ejemplo
Properties\AssemblyInfo.cs
.fuente
private
, pero demasiadasprivate
cosas podrían apuntar a unainternal
clase que está luchando por ser extraída. TDD o no TDD, prefiero tener más pruebas que prueben mucho código, que tener pocas pruebas que ejerzan la misma cantidad de código. Y evitar probarinternal
cosas no ayuda exactamente a lograr una buena relación.#if DEBUG
, el#endif
bloque habilitará esta opción solo en las compilaciones de depuración.Si desea probar métodos privados, eche un vistazo a
PrivateObject
yPrivateType
en elMicrosoft.VisualStudio.TestTools.UnitTesting
espacio de nombres. Ofrecen envoltorios fáciles de usar alrededor del código de reflexión necesario.Documentos: PrivateType , PrivateObject
Para VS2017 y 2019, puede encontrarlos descargando el MSTest.TestFramework nuget
fuente
Agregando a la respuesta de Eric, también puede configurar esto en el
csproj
archivo:O si tiene un proyecto de prueba por proyecto para probar, puede hacer algo como esto en su
Directory.Build.props
archivo:Ver: https://stackoverflow.com/a/49978185/1678053
Ejemplo: https://github.com/gldraphael/evlog/blob/master/Directory.Build.props#L5-L12
fuente
Sigue usando privado por defecto. Si un miembro no debería exponerse más allá de ese tipo, no debería exponerse más allá de ese tipo, incluso dentro del mismo proyecto. Esto mantiene las cosas más seguras y ordenadas: cuando usa el objeto, queda más claro qué métodos debe usar.
Dicho esto, a veces creo que es razonable hacer que los métodos naturalmente privados sean internos para fines de prueba. Prefiero eso a usar la reflexión, que es refactorizadora-hostil.
Una cosa a considerar podría ser un sufijo "ForTest":
Luego, cuando usa la clase dentro del mismo proyecto, es obvio (ahora y en el futuro) que realmente no debería estar usando este método, solo está allí para fines de prueba. Esto es un poco hacky, y no es algo que yo haga, pero al menos vale la pena considerarlo.
fuente
ForTest
enfoque, pero siempre lo encuentro feo (agregando código que no proporciona un valor real en términos de lógica comercial de producción). Por lo general, encuentro que tuve que usar el enfoque porque el diseño es algo desafortunado (es decir, tener que restablecer instanciasForTest
es incorrecto, mientras que si solo hace que el método sea interno, parece que está bien usarlo.También puede usar privado y puede llamar a métodos privados con reflexión. Si está utilizando Visual Studio Team Suite, tiene una buena funcionalidad que generará un proxy para llamar a sus métodos privados por usted. Aquí hay un artículo de proyecto de código que muestra cómo puede hacer el trabajo usted mismo para probar métodos privados y protegidos:
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
En términos de qué modificador de acceso debe usar, mi regla general es comenzar con privado y escalar según sea necesario. De esa manera, expondrá los detalles internos de su clase tan pocos como sean realmente necesarios y ayudará a mantener ocultos los detalles de implementación, como deberían ser.
fuente
Estoy usando
Dotnet 3.1.101
y las.csproj
adiciones que funcionaron para mí fueron:Espero que esto ayude a alguien por ahí!
fuente