xUnidad: afirmar dos listas < T > ¿son iguales?
-
03-07-2019 - |
Pregunta
Soy nuevo en TDD y xUnit, así que quiero probar mi método que se parece a algo como:
List<T> DeleteElements<T>(this List<T> a, List<T> b);
¿Hay algún método Assert que pueda usar? Creo que algo como esto estaría bien
List<int> values = new List<int>() { 1, 2, 3 };
List<int> expected = new List<int>() { 1 };
List<int> actual = values.DeleteElements(new List<int>() { 2, 3 });
Assert.Exact(expected, actual);
¿Hay algo como esto?
Solución
xUnit.Net reconoce las colecciones, por lo que solo debes hacerlo
Assert.Equal(expected, actual); // Order is important
Puede ver otras aserciones de colección disponibles en CollectionAsserts.cs
Para NUnit los métodos de comparación de colecciones de biblioteca son
CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters
y
CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter
Más detalles aquí: CollectionAssert
MbUnit también tiene aserciones de colección similares a NUnit: Assert.Collections.cs
Otros consejos
En la versión actual de XUnit (1.5) solo puedes usar
Assert.Equal (esperado, real);
El método anterior hará una comparación elemento por elemento de las dos listas. No estoy seguro de si esto funciona con alguna versión anterior.
Con xUnit, si desea seleccionar propiedades de cada elemento para probar, puede usar Assert.Collection.
Assert.Collection(elements,
elem1 => Assert.Equal(expect1, elem1.SomeProperty),
elem2 => {
Assert.Equal(expect2, elem2.SomeProperty);
Assert.True(elem2.TrueProperty);
});
Esto prueba el conteo esperado y asegura que cada acción sea verificada.
Recientemente, estuve usando los paquetes xUnit 2.4.0
y Moq 4.10.1
en mi aplicación asp.net core 2.2.
En mi caso, logré que funcionara con un proceso de dos pasos:
- Definición de una implementación de
IEqualityComparer<T>
-
Pase la instancia del comparador como tercer parámetro al método
Assert.True
:Assert.True (esperado, real, nuevo MyEqualityComparer ());
Pero hay otra manera mejor de obtener el mismo resultado utilizando el paquete FluentAssertions . Te permite hacer lo siguiente:
// Assert
expected.Should().BeEquivalentTo(actual));
Es interesante que Assert.Equal ()
siempre falla, incluso cuando ordené los elementos de dos listas para obtenerlos en el mismo orden.