c# - should - FluentAssertions: equivalencia de listas ordenadas
fluentassertions nuget (7)
Estoy tratando de establecer la equivalencia de dos listas usando FluentAssertions en C #, donde dos cosas son importantes:
- los elementos se comparan por los valores que tienen, no por referencia (es decir, son equivalentes, no iguales)
- El orden de los elementos en las listas es importante.
¿No hay ninguna función en FluentAssertions (o incluso NUnit) que haga esto?
¡Aclamaciones!
Creo que solo puedes hacer:
myObject.List.SequenceEqual(myOtherObject.ListToCompare).Should().BeTrue();
Esto solo funcionará si los elementos de la lista son iguales cuando se utiliza Object.Equal(element1, element2)
Si este no es el caso, entonces necesita implementar su propio EqualityComparer para los objetos en las listas, luego use:
myObject.List.SequenceEqual(myOtherObject.ListToCompare, myEqualityComparer)
.Should().BeTrue();
Desea que el método ShouldAllBeEquivalentTo, que debe comparar los valores de las propiedades de los dos gráficos de objetos en una lista.
* Edición: Probablemente usaría la Secuencia Linq igual con un comparador de igualdad personalizado que usa ShouldBeEquivalentTo para preocuparse por el orden de los elementos.
Durante mi lucha con una tarea similar descubrí el siguiente método:
IEnumerable collection = new[] { 1, 2, 5, 8 };
collection
.Should()
.ContainInOrder(new[] { 1, 5, 8 });
La clase Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert puede tener un método que responda a sus necesidades.
CollectionAssert.AreEqual Method (ICollection, ICollection, IComparer) debe hacer el truco.
Dos colecciones son iguales si tienen los mismos elementos en el mismo orden y cantidad. Los elementos son iguales si sus valores son iguales, no si se refieren al mismo objeto.
Tarde al juego aquí, pero uso la versión de Fluent Assertions here :
actualRows.ShouldBeEquivalentTo(expectedRows,options => options.WithStrictOrdering());
Verificará la equivalencia de todos los valores de todas las propiedades, y con esta opción establecerá los conteos de orden. Si el orden no importa, en cuyo caso, omita las opciones param y se asegurará de que el artículo de una colección exista en algún lugar de la otra. Espero que esto ayude a alguien
Yo creo que no Pero siempre puedes escribir una extensión de metón para ese propósito. Es decir
public static void AreEqual<T>(this IList<T> left, IList<T> right)
{
Assert.AreEqual(left.Count, right.Count);
for (int i = 0; i < left.Count - 1; i++)
{
Assert.IsTrue(left[i].Equals(right[i]));
}
}
De forma predeterminada, ShouldBeEquivalentTo()
ignorará el orden en las colecciones porque en la mayoría de los casos, dos colecciones son equivalentes si contienen los mismos elementos en cualquier orden. Si le importa el pedido, solo use una de las sobrecargas de WithStrictOrdering()
en el parámetro options =>
.
Ejemplo:
var myList = Enumerable.Range(1, 5);
var expected = new[]
{
1, 2, 3, 4, 5
};
//succeeds
myList.ShouldBeEquivalentTo(expected, options => options.WithStrictOrdering());
//fails
myList.Reverse().ShouldBeEquivalentTo(expected, options => options.WithStrictOrdering());
Lea más sobre estas opciones en la documentation .