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?

Petar Petrov
fonte

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

Konstantin Spirin
fonte
1
Link do código-fonte alterado para xunit.codeplex.com/SourceControl/changeset/view/…
Julien Roncaglia
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.

Hwiechers
fonte
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.

Drew Williams
fonte
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.

Dmitry Stepanov
fonte
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