Ponemos todas nuestras pruebas unitarias en sus propios proyectos. Descubrimos que tenemos que hacer ciertas clases públicas en lugar de internas solo para las pruebas unitarias. ¿Hay alguna forma de evitar tener que hacer esto? ¿Cuáles son las implicaciones de la memoria al hacer que las clases sean públicas en lugar de selladas?Hacer código interno pero disponible para pruebas unitarias de otros proyectos
Respuesta
Si está utilizando .NET, el atributo de ensamblaje InternalsVisibleTo le permite crear conjuntos "amigos". Estos son ensamblajes específicos con un nombre fuerte que pueden acceder a las clases internas y a los miembros del otro ensamblado.
Nota, esto se debe utilizar con discreción, ya que combina estrechamente los conjuntos involucrados. Un uso común para InternalsVisibleTo es para proyectos de pruebas unitarias. Probablemente no sea una buena opción para el uso en los ensamblajes de aplicaciones reales, por la razón indicada anteriormente.
¡Gracias! Esta definitivamente debería ser la respuesta aceptada. – fresskoma
Sugiero poner #if DEBUG alrededor del atributo, y luego pruebas unitarias en depuración. De esa forma, estarás seguro de que el atributo no está establecido en el código de lanzamiento. –
Esto es sólo una idea, no sé .... ¿Qué tal: #if DEBUG clase pública IniReader #else clases interna IniReader #endif Probablemente no se recomienda? ¿Por qué? – jmelhus
Las clases pueden ser públicas Y selladas.
Pero, no hagas eso.
Puede crear una herramienta para reflejar las clases internas y emitir una nueva clase que acceda a todo a través de la reflexión. MSTest hace eso.
Editar: Quiero decir, si no desea incluir -muchas cosas de prueba en su ensamblaje original; esto también funciona si los miembros son privados.
Espera, ¿qué? ¿Estás diciendo que no hagas una "clase pública sellada"? ¿Cuál es su razonamiento para esa joya? – crush
Si se trata de una clase interna, no se debe utilizar de forma aislada. Por lo tanto, no debería probarlo aparte de probar alguna otra clase que haga uso de ese objeto internamente.
Del mismo modo que no debe probar miembros privados de una clase, no debería probar clases internas de una DLL. Esas clases son detalles de implementación de alguna clase de acceso público, y por lo tanto deben ser ejercidas a través de otras pruebas unitarias.
La idea es que solo desee probar el comportamiento de una clase porque si prueba los detalles de la implementación interna, entonces sus pruebas serán frágiles. Debería poder cambiar los detalles de implementación de cualquier clase sin romper todas sus pruebas.
Si encuentra que realmente necesita probar esa clase, entonces es posible que desee volver a examinar por qué esa clase es interna en primer lugar.
Los detalles de implementación deben ser ejercidos como parte de una prueba abarcadora. No mire las variables privadas ... pruebe el comportamiento esperado. Si la prueba es correcta ... todas las tuberías internas y el cableado deben probarse como parte de ella. Votado arriba. – Gishu
no necesariamente estoy de acuerdo con esto, ya que estas clases son "públicas" para otras clases dentro de la DLL y la funcionalidad de la clase debe probarse indepdentadamente – leora
. Tampoco estoy de acuerdo. Las unidades son unidades y deben probarse de forma aislada. – Sentinel
para fines de documentación
, alternativamente, se puede crear una instancia de clase interna mediante el uso de Type.GetType
método
ejemplo
//IServiceWrapper is public class which is
//the same assembly with the internal class
var asm = typeof(IServiceWrapper).Assembly;
//Namespace.ServiceWrapper is internal
var type = asm.GetType("Namespace.ServiceWrapper");
return (IServiceWrapper<T>)Activator
.CreateInstance(type, new object[1] { /*constructor parameter*/ });
para el tipo genérico hay diferentes proceso como bramido:
var asm = typeof(IServiceWrapper).Assembly;
//note the name Namespace.ServiceWrapper`1
//this is for calling Namespace.ServiceWrapper<>
var type = asm.GetType("Namespace.ServiceWrapper`1");
var genType = type.MakeGenericType(new Type[1] { typeof(T) });
return (IServiceWrapper<T>)Activator
.CreateInstance(genType, new object[1] { /*constructor parameter*/});
- 1. Pruebas unitarias Código AS3 para Flash
- 2. ¿Utiliza pruebas unitarias en sus proyectos profesionales?
- 3. Pruebas unitarias para acceder al código ActiveDirectory
- 4. Pruebas unitarias para malloc()
- 5. SBT Test-Dependencias en multiproyectos: hacer que el código de prueba esté disponible para proyectos dependientes
- 6. SpecFlow/BDD para pruebas unitarias?
- 7. ¿Cómo puedo hacer que HttpContext esté disponible para ser utilizado por mis Pruebas Unitarias?
- 8. Pruebas unitarias Código ASP.NET detrás de
- 9. Combinar informes de pruebas unitarias de proyectos múltiples Gradle compilación
- 10. Pruebas unitarias en XSB Prolog?
- 11. ¿Cómo puedo hacer pruebas unitarias en Perl?
- 12. Mejor práctica para organizar pruebas de selenio y pruebas unitarias
- 13. Pruebas unitarias Código C++ utilizando Java
- 14. Pruebas unitarias de generación automática para el código Java heredado
- 15. ¿Realiza pruebas unitarias para código de no producción?
- 16. Ignorar la cobertura del código para pruebas unitarias en EclEmma
- 17. pruebas unitarias para raspar pantallas?
- 18. Señalarme algunos proyectos de código abierto * con * pruebas (unidad)
- 19. marcos de las pruebas unitarias para C
- 20. ¿Pruebas unitarias para procesos estocásticos?
- 21. Pruebas unitarias para scripts de shell
- 22. ¿Realmente está usando pruebas unitarias?
- 23. ¿Existen marcos de pruebas unitarias automatizadas para probar un marco interno de enhebrado?
- 24. ¿Las pruebas unitarias deben escribirse antes de escribir el código?
- 25. Pruebas unitarias para salida HTML?
- 26. Pruebas unitarias para PL/SQL
- 27. ¿Pruebas unitarias o pruebas funcionales?
- 28. Creación de datos falsos para pruebas unitarias
- 29. Estándares de escritura para pruebas unitarias
- 30. ¿Es malo agregar código solo para pruebas unitarias?
posible duplicado de [C# modificador de acceso "interno" fier al hacer pruebas unitarias] (http://stackoverflow.com/questions/358196/c-sharp-internal-access-modifier-when-doing-unit-testing) –