xUnit: ¿Afirmar dos List <T> son iguales?

108

Soy nuevo en TDD y xUnit, así que quiero probar mi método que se parece a:

List<T> DeleteElements<T>(this List<T> a, List<T> b);

¿Existe algún método Assert que pueda utilizar? 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?

Petar Petrov
fuente

Respuestas:

135

xUnit.Net reconoce colecciones, por lo que solo necesita hacer

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 bibliotecas 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

Konstantin Spirin
fuente
1
El enlace del código fuente cambió para xunit.codeplex.com/SourceControl/changeset/view/…
Julien Roncaglia
1
El nuevo enlace en los comentarios también está roto.
Scott Stafford
1
El proyecto ahora se movió a GitHub, pero tampoco he podido encontrar ese archivo fuente en particular allí.
MEMark
1
Para objetos complejos, no olvide que necesita un Equal + GetHasCode para que esto funcione o asigne al método Equal un EqulityComparer personalizado
maracuja-juice
2
El método xUnit Equal devuelve falso para dos IEnumerables con el mismo contenido.
Vladimir Kocjancic
31

En la versión actual de XUnit (1.5) puede 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 para alguna versión anterior.

hwiechers
fuente
7
El problema que encontré con Assert.Equal para las colecciones es que falla si los elementos de las colecciones están en diferentes órdenes, incluso si los elementos están presentes en ambos.
Scott Lawrence
1
@ ScottA.Lawrence ¡Las listas también tienen orden! ¿Obtienes el mismo comportamiento con HashSets?
johv
@johv No lo he probado con HashSets, pero es una buena idea. Una vez que haya tenido la oportunidad de probarlo, intentaré recordar responder aquí.
Scott Lawrence
2
También parece fallar si los tipos de colección son diferentes, incluso si ambos contienen los mismos elementos en el mismo orden.
James White
3
Pero tiene una salida muy mala. ¡No te dice DÓNDE difieren dos listas! :(
Zordid
16

Con xUnit, si desea seleccionar las 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 recuento esperado y garantiza que se verifique cada acción.

Drew Williams
fuente
2

Recientemente, estaba usando paquetes xUnit 2.4.0y Moq 4.10.1en mi aplicación asp.net core 2.2.

En mi caso, logré que funcionara con un proceso de dos pasos:

  1. Definiendo una implementación de IEqualityComparer<T>

  2. Pase la instancia del comparador como tercer parámetro al Assert.Truemétodo:

    Assert.True(expected, actual, new MyEqualityComparer());

Pero hay otra forma más agradable de obtener el mismo resultado usando el paquete FluentAssertions . Te permite hacer lo siguiente:

// Assert          
expected.Should().BeEquivalentTo(actual));

Curiosamente, eso Assert.Equal()siempre falla incluso cuando ordené los elementos de dos listas para obtenerlos en el mismo orden.

Dmitry Stepanov
fuente
2
algo está mal con su pedido BeEquivalentTo no se preocupa por el pedido (es por eso que su prueba pasa con BeEquivalentTo y no con assert.Equal)
RagnaRock