Gerardo Contijoch

Experiencias del día a día trabajando con .NET – ASP.NET, C#, ASP.NET MVC y demas…

Crear mocks de clases internas con Rhino Mocks

Posted by Gerardo Contijoch en abril 10, 2009

Hoy descubrí que no se pueden crear mocks de clases con visibilidad internal (o Friend en VB) con Rhino Mocks, lo cual me llamó mucho la atención, mas que nada porque no me había topado nunca antes con ese problema y soy de usar mucho clases internas. El error que se nos presenta cuando intentamos hacerlo es el siguiente:

Castle.DynamicProxy.Generators.GeneratorException: Type is not public, so a proxy cannot be generated. Type: <NOMBRE_TIPO_INTERNAL>

Resulta que cuando creamos mocks, en realidad lo que creamos son proxies a las clases que mockeamos, los cuales interceptan las llamadas a las mismas y simulan el comportamiento que nosotros deseemos. Estos proxies, aparentemente, son generados en tiempo de ejecución en un assembly que se llama DynamicProxyGenAssembly2 (hay que revisar el código de Castle.DynamicProxy.ModuleScope para encontralo), el cual no tiene acceso a los miembros internos del assembly nuestro y es por eso que obtenemos el error que mencioné arriba.

Para solucionar esto, simplemente hay que agregar el atributo InternalsVisibleToAttribute a nuestro assembly y especificar DynamicProxyGenAssembly2 como parámetro.

En realidad no conozco mucho sobre el funcionamiento interno de las clases de Castle.DynamicProxy por lo que no puedo asegurar que el assembly generado dinámicamente siempre va a ser llamado de la misma forma así como tampoco puedo asegurar que los mocks van a funcionar como se espera. Por lo que pude ver no hay problemas y hasta ahora todo el código que escribí basado en esta técnica siempre funcionó como se espera.

¡Nos vemos en el próximo post!

Publicado originalmente en https://gerardocontijoch.wordpress.com.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: