¿Alguna vez has tenido que testear un endpoint que devuelve un objeto con 30 propiedades? Terminas con un archivo de test lleno de Assert.Equal(esperado.Nombre, resultado.Nombre); repetido 30 veces. Si una propiedad cambia, el test falla y tienes que actualizarlo a mano.
Verify cambia las reglas: toma una «foto» (snapshot) del objeto la primera vez, y en las siguientes ejecuciones, compara el resultado actual contra esa foto.
Configuración de «Verify» en tu Proyecto
Para empezar, necesitas instalar el paquete NuGet en tu proyecto de XUnit, NUnit o MSTest:
<PackageReference Include="Verify.Xunit" Version="28.x.x" />
El Tutorial Técnico: Tu primer Snapshot
Imagina que tienes un objeto Order muy complejo que viene de un sistema de microservicios (quizás el que ya medimos con IMeterFactory).
El Enfoque Tradicional (Frágil y Tedioso)
[Fact]
public void TestPedidoTradicional()
{
var resultado = _service.GetOrder(123);
Assert.Equal(123, resultado.Id);
Assert.Equal("Procesado", resultado.Status);
// ... y 20 líneas más de Asserts
}
El Enfoque con Verify (Limpio y Robusto)
[UsesVerify] // Requerido en XUnit
public class OrderTests
{
[Fact]
public Task GetOrder_ReturnsCorrectSnapshot()
{
var result = _service.GetOrder(123);
// Verify serializa el objeto a JSON y lo compara con el archivo guardado
return Verify(result);
}
}
Qué pasa cuando el test corre?
Aquí es donde ocurre la magia técnica:
- Primera ejecución: Verify creará un archivo llamado OrderTests.GetOrder_ReturnsCorrectSnapshot.received.json. El test fallará porque no hay una «verdad absoluta» (snapshot) todavía.
- Aprobación: Tú revisas el JSON. Si es correcto, renombras el archivo a .verified.json (o usas la extensión de VS Code/Visual Studio para darle a «Accept»).
- Siguientes ejecuciones: Si cambias una sola coma en la lógica de tu código que afecte al objeto, Verify abrirá una herramienta de Diff (como WinMerge o la de VS) mostrándote exactamente qué cambió.
¿Snapshot vs Unit Testing Clásico?
No todo es color de rosa. Hay que saber cuándo usar cada uno.
| Característica | Unit Test Clásico (Asserts) | Snapshot Testing (Verify) |
| Mantenimiento | Alto (Actualizar código de test) | Bajo (Aceptar nuevo snapshot) |
| Claridad | Explícita (Ves qué se está probando) | Implícita (Debes ver el archivo JSON) |
| Ideal para… | Lógica booleana, cálculos simples | Reportes, JSONs de API, HTML, PDFs |
| Fragilidad | Baja | Alta (Cualquier cambio de formato rompe el test) |
Escenario de Falla: El peligro del «Aceptar todo»
El mayor riesgo de Verify es la pereza. Si un desarrollador ve que el test falló y simplemente le da a «Aceptar» al nuevo snapshot sin revisar el Diff, podría estar institucionalizando un bug. Si el precio de un producto cambió de 100 a 0 y le das a «Verify», ahora tu test dirá que 0 es el valor correcto para siempre.
Notas
- Scrubbing (Limpieza de Datos): Los campos como DateTime.Now o Guid.NewGuid() romperán tu snapshot cada vez. Verify permite «limpiar» estos datos:
Verify(result)
.ScrubMember<Order>(x => x.CreatedAt)
.ScrubGuid();
- No solo para JSON: Verify puede comparar imágenes, PDFs e incluso HTML. Si trabajas en un motor de facturación, puedes verificar que el PDF generado sea idéntico pixel por pixel al anterior.
- Usa el Diff Tool: Configura tu herramienta de Diff favorita. Verify detecta automáticamente herramientas como Beyond Compare, P4Merge o VS Code.
- Control de Versiones: Los archivos .verified.json DEBEN subirse al repositorio (Git). Son parte de tu documentación técnica.
Conclusión
Snapshot Testing con Verify no reemplaza al unit testing clásico, lo complementa estratégicamente. Cuando trabajas con objetos complejos, respuestas JSON extensas o documentos generados, reduce drásticamente el ruido de 30 asserts repetitivos y convierte el test en una verificación estructural completa. Pero exige disciplina: nunca “aceptes” un snapshot sin revisar el diff, controla la cardinalidad de cambios dinámicos con scrubbing y versiona siempre los .verified.json en Git. Usa asserts tradicionales para lógica crítica y booleana; usa snapshots para contratos de salida y formatos complejos. Bien aplicado, Verify no solo simplifica tests: fortalece la gobernanza técnica de tus APIs y artefactos.
