Pex y Contracts: Juntos son dinamita

Nuestro buen amigo Fernando Machado escribió un excelente artículo, aquí el detalle:

Pex y Contracts: Juntos son dinamita

Pex es un generador automático de pruebas de unidad que se integra con Visual Studio. Contracts es una implementación de un concepto llamado Diseño por Contrato (DBC por sus iniciales en inglés). En este artículo muestro cómo usar Pex y Contracts juntos para mejorar la calidad del código.

Hace un tiempo estuve trabajando en una aplicación en la que necesitaba cargar dinámicamente los tipos disponibles en ciertos ensamblados que implementaran cierta interfaz. No quiero entrar en los detalles cómo se resuelve ese problema de la carga dinámica de tipos (que dicho sea de paso podría haber intentado resolver con el Managed Extensibility Framework), sino cómo he usado Pex y Contracts para resolverlo.

He implementado una clase Helper que puede encontrar esos tipos buscando todos los tipos del ensamblado que implementan la interfaz dada. La clase también puede asegurarse que es posible crear instancias de esos tipos, buscando entre los métodos de instancia un constructor. Luego puede invocar el constructor para crear nuevas instancias de esos tipos.

Aquí está el código de la clase Helper para este artículo:

clip_image001

El método LoadTypesFrom recibe el nombre completo incluyendo el camino de un ensamblado y el nombre de una interfaz; retorna una lista con todos los tipos en ese ensamblado que implementan esa interfaz.

La lista se retorna como IEnumerable<Type> y no como IList<Type> o ICollection<Type> para evitar que los clientes de Helper puedan siquiera accidentalmente modificar la lista quitando o agregando otros tipos que eventualmente pudieran no implementar la interfaz deseada.

El método funciona cargando el ensamblado a partir del nombre completo con Assembly.LoadFrom. Luego se obtienen todos los tipos con Assembly.GetExportedTypes. Por último se itera entre esos tipos y se determina si implementan la interfaz o no usando Type.GetInterface. Los tipos que implementan la interfaz son agregados al resultado.

El método GetDllsIn recibe el nombre de una carpeta y retorna una lista con todos los archivos con extensión .DLL en esa carpeta. La lista también se retorna como un IEnumerable<FileInfo> por las mismas razones que ya les comenté para el método anterior.

El método simplemente usa DirectoryInfo.GetFiles para obtener la lista de archivos.

El método CreateInstance recibe un tipo como parámetro y retorna una instancia de ese tipo.

El método busca primero un constructor sin parámetros usando Type.GetConstructor y luego crea la instancia invocando ese constructor con ConstructorInfo.Invoke.

Voy a crear los tests de unidad en Visual Studio, habiendo instalado Pex y Contracts previamente.

Ahora comienza la magia. Hago clic con el botón secundario en LoadTypesFrom y hago clic RunPex para invocar Pex.

Para ver el articulo completo

Saludos.

Fernando García Loera (MVP Lead – Latin America Region)

clip_image001clip_image002clip_image004clip_image001[1]clip_image006clip_image008

Que es un MVP? Tips para ser MVP