xUnit: Assert Lista dois são iguais?
-
03-07-2019 - |
Pergunta
Eu sou novo para TDD e xUnit assim que eu quero testar o meu método que é algo como:
List<T> DeleteElements<T>(this List<T> a, List<T> b);
Existe algum método Assert que eu posso usar? Eu acho que algo como isso 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 parecido com isso?
Solução
xUnit.Net reconhece coleções para que você só precisa fazer
Assert.Equal(expected, actual); // Order is important
Você pode ver outras afirmações de recolha disponíveis em CollectionAsserts.cs
Para NUnit métodos de comparação acervo da biblioteca 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 coleta semelhantes a NUnit: Assert.Collections.cs
Outras dicas
Na versão atual do xUnit (1.5) você pode simplesmente usar
Assert.Equal (esperado, real);
O método acima fará um elemento em comparação elemento das duas listas. Eu não tenho certeza se isso funciona para qualquer versão anterior.
Com xUnit, se você quiser propriedades cereja escolher de cada elemento para testar você 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 e garante espera que cada ação é verificada.
Recentemente, eu estava usando xUnit 2.4.0
e pacotes Moq 4.10.1
em meu aplicativo núcleo asp.net 2.2.
No meu caso eu consegui-lo funcionar com duas etapas de processo:
- A definição de uma implementação de
IEqualityComparer<T>
-
Passe o exemplo comparador como um terceiro parâmetro do método em
Assert.True
:Assert.True(expected, actual, new MyEqualityComparer());
Mas há uma outra maneira mais agradável para obter o mesmo resultado usando pacote FluentAssertions . Ele permite que você faça o seguinte:
// Assert
expected.Should().BeEquivalentTo(actual));
Curiosamente que Assert.Equal()
sempre falha, mesmo quando eu pedi os elementos de duas listas para obtê-los na mesma ordem.