.net - verifiable - ¿Cómo burlarse del método interno de una clase?
verify moq (6)
¿Por qué querrías burlarte de un método interno?
Si encuentra la necesidad de burlarse de un método interno, por ejemplo, para evitar una dependencia o una interacción, tal vez debería considerar el rediseño de la clase.
La inversión de control y la inyección de dependencia son algunas posibles estrategias de diseño que pueden reducir el acoplamiento y aumentar la cohesión de sus clases y eliminar la necesidad de simular métodos internos.
No creo que haya un camino claro hacia la burla no pública con Moq.
Pero, si es absolutamente necesario, puedes usar el aislador TypeMock para simular cualquier cosa.
Además, para que no se pierda en el alboroto: Thomas vinculó un buen artículo sobre el uso de MS Moles gratuitos para burlarse de los miembros no públicos.
Burlándose de lo ineludible: usar Microsoft Moles con Gallio
Tengo una clase que tiene un método interno y quiero burlarme del método interno. Pero no puedo burlarme, es decir, no está llamando a la función simulada, sino llamando a la función original. ¿Hay alguna manera de lograr esto?
Edit: En realidad soy un novato en el Moq. Tengo muchas clases y métodos de las clases para probar usando el Moq. Muchas clases son internas, muchas tienen métodos internos, muchas tienen métodos no virtuales. Y no se puede cambiar la firma en los métodos y clases. ¿Puede alguien, por favor, hacerme saber cómo probar este escenario utilizando Moq? O bien, por favor, sugiérame algún otro marco de prueba que sea fácil de aprender y de trabajar.
Las pruebas unitarias deben probar la interfaz de una clase. Puede simular las dependencias, pero los detalles de la implementación de la clase en sí (como los métodos privados) deben probarse como parte de toda la clase, no por separado, y no deben cambiarse para la prueba (de lo contrario, estaría probando una unidad diferente). ser usado).
Si cree que es necesario cambiar el método para que la clase sea verificable, refactorice la clase para que la parte difícil se convierta en una dependencia, o sea sustituible por un parámetro o subclase.
Marque el método como internal *protected*
(también virtual, por supuesto)
No con Moq.
Pero puedes usar el framework Moles gratuito de MS para hacer tales cosas. Escribí sobre esto aquí: burlándose de lo ineludible: usando Microsoft Moles con Gallio . (Se aplica no solo a Gallio, sino que da una buena impresión general de lo que puede hacer con los lunares ...). La otra alternativa sería Typemock ...
HTH. Thomas
Puede simular fácilmente métodos virtuales internos agregando lo siguiente a su AssemblyInfo.cs:
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] // namespace in Moq
[assembly: InternalsVisibleTo("YourTestClass")]
Si su ensamblaje tiene un nombre seguro, deberá incluir la clave pública para DynamicProxyGenAssembly2 (Gracias al comentario de @bvgheluwe; fuente: guía de inicio rápido de Moq) :
[assembly:InternalsVisibleTo("DynamicProxyGenAssembly2,PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
No entiendo por qué la respuesta aceptada dice que nunca debes hacerlo. ¿No es eso lo que hace cuando utiliza la técnica de inyección de dependencia ''Extraer y anular'' (método de fábrica local) descrita por Roy Osherove en el Capítulo 3 de El arte de las pruebas unitarias ?
Si necesita probar un montón de código que no puede cambiar, debería ir con MS Moles o TypeMock desde el principio.
Los marcos de simulacros gratuitos como Moq solo le dan soporte en interfaces y métodos virtuales de todos modos. No suena como si vas a ir muy lejos con eso ...
Thomas