Uso de IoC para pruebas unitarias

¿Cómo se puede usar un contenedor IoC para pruebas unitarias? ¿Es útil administrar burlas en una gran solución (más de 50 proyectos) usando IoC? Alguna experiencia? ¿Alguna biblioteca C # que funcione bien para usarla en pruebas unitarias?

En términos generales, un Contenedor DI no debería ser necesario para las pruebas unitarias porque la prueba unitaria tiene que ver con la separación de responsabilidades.

Considere una clase que usa Constructor Injection

public MyClass(IMyDependency dep) { } 

En toda su aplicación, puede ser que haya un gran gráfico de dependencia oculto detrás de IMyDependency , pero en una prueba unitaria, lo aplana a un solo Test doble .

Puede usar simulaciones dinámicas como Moq o RhinoMocks para generar el Test Double, pero no es obligatorio.

 var dep = new Mock().Object; var sut = new MyClass(dep); 

En algunos casos, puede ser agradable tener un contenedor de burla automática , pero no es necesario utilizar el mismo Contenedor DI que utiliza la aplicación de producción.

¿Cómo se puede usar un Ioc Container para pruebas unitarias?

IoC hará cumplir los paradigmas de progtwigción que facilitarán las pruebas unitarias de forma aislada (es decir, utilizando simulaciones): uso de interfaces, no new (), no singletons …

Pero el uso del contenedor IoC para las pruebas no es realmente un requisito, solo proporcionará algunas instalaciones, por ejemplo, la inyección de simulacros, pero puede hacerlo manualmente.

¿Es útil administrar burlas en una gran solución (más de 50 proyectos) usando IoC?

No estoy seguro de a qué te refieres al administrar burlas usando IoC. De todos modos, los contenedores IoC por lo general pueden hacer más que inyectar burlas cuando se trata de pruebas. Y si tiene soporte IDE decente que hace posible la refactorización, ¿por qué no usarla?

¿Cualquier experiencia?

Sí, en una solución enorme, necesita más que nunca una solución no propensa a errores y perjudicial para la refactorización (es decir, a través de un contenedor tipo IoC seguro o con un buen soporte IDE).

A menudo utilizo un contenedor IoC en mis pruebas. Por supuesto, no son “pruebas unitarias” en el sentido puro. IMO Son más BDDish y facilitan la refactorización. Las pruebas están ahí para darle confianza para refactorizar. Las pruebas mal escritas pueden ser como verter cemento en su código.

Considera lo siguiente:

 [TestFixture] public class ImageGalleryFixture : ContainerWiredFixture { [Test] public void Should_save_image() { container.ConfigureMockFor() .Setup(r => r.Create(It.IsAny())) .Verifiable(); AddToGallery(new RequestWithRealFile()); container.VerifyMockFor(); } private void AddToGallery(AddBusinessImage request) { container.Resolve().Consume(request); } } 

Hay varias cosas que suceden al agregar una imagen a la galería. La imagen cambia de tamaño, se genera una miniatura y los archivos se almacenan en AmazonS3. Al usar un contenedor, puedo aislar más fácilmente solo el comportamiento que deseo probar, que en este caso es la parte que persiste.

Una extensión de contenedor de burla automática es útil cuando se utiliza esta técnica: http://www.agileatwork.com/auto-mocking-unity-container-extension/

Usando contenedores con capacidad para resolver servicios no registrados / conocidos como SimpleInjector , DryIoc (su mina) puede devolver burlas para interfaces aún no implementadas.

Lo que significa que puede comenzar el desarrollo con la primera implementación simple y sus dependencias burladas, y reemplazarlas con algo real a medida que progresa.