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
Respuesta
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
.
¿Lo agrego al proyecto de prueba o al proyecto bajo prueba!?!? – akuhn
Agréguelo al proyecto bajo prueba (por ejemplo, en Propiedades \ AssemblyInfo.cs). "MyTests" sería el ensamblaje de prueba. – EricSchaefer
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. –
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.
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
Cuando baje la votación por favor deje un comentario. Gracias. –
Es estúpido votar esta respuesta. Apunta a una nueva solución y una muy buena que no se mencionó anteriormente. –
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.
Si el método es interno, ¿esto no impide su uso del ensamblaje de prueba? –
@Ralph: No se usa InternalsVisibleTo. –
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
- 1. ¿Visual Studio no depura cuando se realizan pruebas de unidades de depuración?
- 2. Doxygen con el modificador de acceso interno C#
- 3. ¿Cuándo utilizarías el modificador de acceso "protegido interno"?
- 4. Modificador de acceso de subclases C++?
- 5. Modificador de acceso predeterminado en C#
- 6. C# Modificador de acceso predeterminado del método Main()
- 7. ¿Cómo evitar las "estadísticas de reconstrucción" de SQL Server cuando se realizan pruebas de rendimiento?
- 8. método sin modificador de acceso
- 9. modificador de acceso predeterminado para enum en C#
- 10. ¿Cómo se realizan las pruebas "limpias" en Macintosh sin virtualización?
- 11. Serialize List <> de clases declaradas con modificador interno?
- 12. Cómo cambiar el modificador de acceso predeterminado en Resharper (R #) a interno
- 13. ¿Cómo se realizan las pruebas unitarias de IgnoreRoute en ASP.NET MVC
- 14. ¿Cómo creo pruebas de unidades flexibles?
- 15. Usando SimpleHTTPServer para pruebas de unidades
- 16. ¿Qué modo se prefiere cuando se realizan llamadas WCF asíncronas?
- 17. Marco preferido de pruebas de unidades Python
- 18. Diferencia entre especificador de acceso y modificador de acceso
- 19. ¿Cómo se usa tornado.testing para crear pruebas de unidades WebSocket?
- 20. ¿Cómo se generan pruebas de unidades dinámicas (parametrizadas) en python?
- 21. Generación automática de pruebas de unidades .NET
- 22. ¿Qué hacer cuando una nueva característica causa que las pruebas de unidades existentes se vuelvan inválidas?
- 23. Pruebas de unidades es maravilloso, pero
- 24. TDD: ¿Es plausible tener pruebas de integración, pero no pruebas de unidades?
- 25. Externo interno estático C# con atributo InternalCall - ¿interno o externo?
- 26. Poblar SQLite en la memoria para pruebas de unidades
- 27. Cuando se realizan pruebas unitarias, ¿tiene que usar una base de datos para probar las operaciones CRUD?
- 28. Cómo aumentar el modificador de acceso de una propiedad
- 29. Cakephp las pruebas de acceso
- 30. Ejecutar pruebas de unidades de JavaScript dentro de Visual Studio
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. –