shouldbeequivalentto should fluentassertions c# unit-testing nunit fluent-assertions

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:

  1. los elementos se comparan por los valores que tienen, no por referencia (es decir, son equivalentes, no iguales)
  2. 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 });

Recogida de aseveraciones docs.



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 .