Como compañero de mi serie de blogs sobre .NET Bocking Frameworks y cómo funcionan, este repositorio intenta implementar las mismas pruebas unitarias con simulacros utilizando cada uno de los principales marcos de burla disponibles para .NET.
Este proyecto está destinado a ser una referencia para cualquier persona que busque comparar los marcos de burla de .NET o ver ejemplos de sintaxis para un marco dado. No está destinado a ser una referencia exhaustiva, no se trata de estar libre de errores (pero hágamelo saber si encuentra algún problema).
Para escribir pruebas, necesitamos algún código que necesite pruebas. Por lo tanto, he creado el LunchNotifier , una clase de ligero ligeramente más que el hello contra la cual se pueden escribir pruebas unitarias (con simulacros).
Uno de los beneficios proporcionados a los empapoyes de desbordamiento de pila que trabajan en la oficina de Nueva York es el almuerzo gratis de los chefs internos. Todos los días, cuando los cocineros hayan completado la preparación de la comida, una notificación está con los empleados de la oficina para hacerles saber que hay comida disponible.
En el proyecto CodeBeingTested , la clase LunchNotifier es nuestro objetivo principal.
Esta clase toma tiene cinco dependientes externas que deben burlarse para realizar nuestras pruebas:
INotificationService (inyectado a través del constructor)ILogger (inyectado a través del constructor)IEmployeeService (inyectado a través del constructor)IEmployee ) con sede en la oficina de Nueva YorkIEmployee (devuelto de IEmployeeService )System.DateTime La lógica principal está en LunchNotifier.SendLunchtimeNotifications() . Este método incluye una llamada en línea a System.DateTime.Now , que no se puede burlar de marcos enchufados como MOQ o Rinomocks:
public void SendLunchtimeNotifications()
{
var now = DateTime.Now;
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
Se proporciona una implementación alternativa para DateTime.Now uso por marcos enchufados en LunchNotifier.SendLunchtimeNotifications_DateTimeSeam()
public virtual DateTime GetDateTime() => DateTime.Now;
public void SendLunchtimeNotifications_DateTimeSeam()
{
var now = GetDateTime();
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
Cada uno de los proyectos restantes intenta implementar un conjunto similar de pruebas unitarias contra el LunchNotifier utilizando diferentes marcos de burla.
Todas las pruebas se escriben usando NUNIT V3.10 a través del paquete Nuget.
En algunos casos, hay múltiples formas de abordar una prueba utilizando el marco de burla, por lo que he proporcionado múltiples variantes de la prueba para mostrar los diferentes enfoques.
Esta prueba crea un empleado simulado "Bob" que prefiere las notificaciones de correo electrónico y utiliza simulacros para garantizar que la lógica LunchNotifier le envíe un correo electrónico cuando el almuerzo esté listo.
Esta prueba crea dos empleados simulados, "Bob" y "Martha" y se asegura de que si enviar una notificación a uno de ellos resulta en el error que registra y no impide que los empleados restantes reciban una notificación.
Esta prueba utiliza la sintaxis TestCase de NUNIT para ejecutar dos casos de prueba, uno para antes de la 1 p.m. y otro para después de la 1 p.m., para garantizar que la plantilla de notificación adecuada se use en función de la hora del día.
Para los marcos no restringidos, DateTime.Now ahora se puede controlar directamente para devolver el tiempo de entrada de la prueba, sin embargo, los marcos restringidos no pueden, por lo que deben extraer la llamada a DateTime.Now ahora en un método specte y modificar el comportamiento de ese nuevo método. Por lo tanto, la necesidad de la variante SendLunchtimeNotifications_DateTimeSeam .
Tipo: restringido
Proyecto: https://github.com/moq/moq4/wiki/quickstart
Nuget: https://www.nuget.org/packages/moq/
Tipo: restringido
Proyecto: https://github.com/hibernating-rhinos/rhino-mocks
Nuget: https://www.nuget.org/packages/rhinomocks
ADVERTENCIA: Rhinomocks es efectivamente un proyecto muerto y probablemente no brindará soporte para futuros cambios en .NET, como .NET Core. No le sugiero que comience a usar este marco si aún no lo está usando.
Para ejecutar estas pruebas, debe tener instalado VS2017 Enterprise (o Equiv).
Tipo: restringido
Proyecto: http://nsubstitute.github.io/
Nuget: https://www.nuget.org/packages/nsubstitute
Tipo: sin restricciones
Microsoft Fakes se produce como parte de Visual Studio 2017 Enterprise o Visual Studio 2015 Ultimate y no está disponible como un componente espectario.
Las falsificaciones no admiten de forma nativa la validación de estilo de AssertWasCalled , por lo que utilizo un paquete Nuget adicional (al que he contribuido) para proporcionar esa función: falsificaciones.contrib / nuget
Tipo: sin restricciones
Información del producto: https://www.typemock.com/isolator
Este producto requiere una licencia pagada (hay una prueba gratuita de 15 días disponible) para burlarse sin restricciones. Typemock fue lo suficientemente agradable como para proporcionarme una licencia comunitaria gratuita para que pueda trabajar en proyectos como este.