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?

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


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.


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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.