visual unitarias unit test studio pruebas proyecto mvc hacer ejecutar c# unit-testing scope

c# - test - Hacer código interno pero disponible para pruebas unitarias de otros proyectos



testing in c# visual studio (4)

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.

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?


Si está utilizando .NET, el atributo de ensamblaje InternalsVisibleTo permite crear ensamblajes "amigos". Estos son ensamblajes específicos con un nombre fuerte que pueden acceder a las clases internas y a los miembros del otro ensamblado.

Tenga en cuenta que esto debe usarse con discreción, ya que combina estrechamente los ensamblajes 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.


Si se trata de una clase interna, no se debe usar 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 quieras probar el comportamiento de una clase porque si pruebas los detalles de implementación interna, tus 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.


para fines de documentación

alternativamente puede instanciar la clase interna mediante el método Type.GetType

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 procesos como abajo:

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*/});