xUnit: Afirmar que duas List <T> são iguais?


108

Sou novo em TDD e xUnit, então quero testar meu método que se parece com:

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

Existe algum método Assert que eu possa usar? Eu acho que algo assim seria bom

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);

Existe algo assim?

Respostas:


135

xUnit.Net reconhece coleções, então você só precisa fazer

Assert.Equal(expected, actual); // Order is important

Você pode ver outras afirmações de coleção disponíveis em CollectionAsserts.cs

Para métodos de comparação de coleção de biblioteca NUnit são

CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters

e

CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter

Mais detalhes aqui: CollectionAssert

MbUnit também tem asserções de coleção semelhantes a NUnit: Assert.Collections.cs



1
Novo link nos comentários também quebrado.
Scott Stafford

1
O projeto foi movido para o GitHub, mas também não consegui encontrar esse arquivo de origem específico.
MEMark de

1
Para objetos complexos, não se esqueça de que você precisa de um Equal + GetHasCode para que isso funcione ou dê ao método Equal um EqulityComparer personalizado
suco de maracuja

2
O método xUnit Equal retorna falso para dois IEnumerables com conteúdo igual.
Vladimir Kocjancic

31

Na versão atual do XUnit (1.5), você pode apenas usar

Assert.Equal (esperado, real);

O método acima fará uma comparação elemento a elemento das duas listas. Não tenho certeza se isso funciona para qualquer versão anterior.


7
O problema que encontrei com Assert.Equal para coleções é que ele falha se os elementos das coleções estão em ordens diferentes, mesmo se os elementos estiverem presentes em ambos.
Scott Lawrence

1
As listas @ ScottA.Lawrence também têm ordem! Você obtém o mesmo comportamento com HashSets?
johv

@johv Não testei com HashSets, mas é uma boa ideia. Assim que tiver a chance de tentar, tentarei me lembrar de responder aqui.
Scott Lawrence

2
Também parece falhar se os tipos de coleção forem diferentes, mesmo se ambos contiverem os mesmos itens na mesma ordem.
James White,

3
Mas tem uma saída muito ruim. Não diz ONDE duas listas diferem! :(
Zordid

16

Com o xUnit, se você quiser selecionar as propriedades de cada elemento para testar, pode usar Assert.Collection.

Assert.Collection(elements, 
  elem1 => Assert.Equal(expect1, elem1.SomeProperty),
  elem2 => { 
     Assert.Equal(expect2, elem2.SomeProperty);
     Assert.True(elem2.TrueProperty);
  });

Isso testa a contagem esperada e garante que cada ação seja verificada.


2

Recentemente, eu estava usando xUnit 2.4.0eMoq 4.10.1 pacotes em meu núcleo asp.net 2.2 aplicativo.

No meu caso, consegui fazê-lo funcionar com um processo de duas etapas:

  1. Definindo uma implementação de IEqualityComparer<T>

  2. Passe a instância do comparador como um terceiro parâmetro no Assert.Truemétodo:

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

Mas existe outra maneira melhor de obter o mesmo resultado usando o pacote FluentAssertions . Ele permite que você faça o seguinte:

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

Curiosamente, isso Assert.Equal()sempre falha, mesmo quando ordenei os elementos de duas listas para colocá-los na mesma ordem.


2
algo está errado com o seu pedido BeEquivalentTo não se importa com o pedido (é por isso que seu teste passa com BeEquivalentTo e não com assert.Equal)
RagnaRock
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.