Estou tentando afirmar que um objeto é "igual" a outro objeto.
Os objetos são apenas instâncias de uma classe com várias propriedades públicas. Existe uma maneira fácil de o NUnit afirmar a igualdade com base nas propriedades?
Esta é a minha solução atual, mas acho que pode haver algo melhor:
Assert.AreEqual(LeftObject.Property1, RightObject.Property1)
Assert.AreEqual(LeftObject.Property2, RightObject.Property2)
Assert.AreEqual(LeftObject.Property3, RightObject.Property3)
...
Assert.AreEqual(LeftObject.PropertyN, RightObject.PropertyN)
O que eu pretendo seria no mesmo espírito que o CollectionEquivalentConstraint, em que o NUnit verifica se o conteúdo de duas coleções é idêntico.
fonte
IEnumerable
lo, ele será comparado como uma coleção, independentemente das implementações substituídas,Equals
porque o NUnit ofereceIEnumerable
maior precedência. Veja osNUnitEqualityComparer.AreEqual
métodos para detalhes. Você pode substituir o comparador usando um dosUsing()
métodos da restrição de igualdade . Mesmo assim, não é suficiente implementar o não genéricoIEqualityComparer
devido ao adaptador que o NUnit usa.GetHashCode()
de tipos mutáveis se comportará mal se você usar esse objeto como chave. IMHO, substituindoEquals()
,GetHashCode()
e tornando o objeto imutável apenas para testar não faz sentido.Se você não puder substituir Igual por qualquer motivo, poderá criar um método auxiliar que itere pelas propriedades públicas por reflexão e afirme cada propriedade. Algo assim:
fonte
Não substitua Igual apenas para fins de teste. É tedioso e afeta a lógica do domínio. Em vez de,
Use JSON para comparar os dados do objeto
Nenhuma lógica adicional em seus objetos. Nenhuma tarefa extra para teste.
Basta usar este método simples:
Parece funcionar muito bem. As informações dos resultados do executor de teste mostrarão a comparação de cadeias JSON (o gráfico de objetos) incluída para que você veja diretamente o que está errado.
Observe também! Se você possui objetos complexos maiores e apenas deseja comparar partes deles, pode ( use o LINQ para dados de sequência ) criar objetos anônimos para usar com o método acima.
fonte
Experimente a biblioteca FluentAssertions:
http://www.fluentassertions.com/
Também pode ser instalado usando o NuGet.
fonte
actual.ShouldBeEquivalentTo(expected, x => x.ExcludingMissingMembers())
Prefiro não substituir Igual apenas para ativar o teste. Não se esqueça de que, se você substituir o Igual, também deverá substituir o GetHashCode ou poderá obter resultados inesperados se estiver usando seus objetos em um dicionário, por exemplo.
Eu gosto da abordagem de reflexão acima, pois ela serve para adicionar propriedades no futuro.
Para uma solução rápida e simples, no entanto, geralmente é mais fácil criar um método auxiliar que testa se os objetos são iguais ou implementar o IEqualityComparer em uma classe que você mantém privada para seus testes. Ao usar a solução IEqualityComparer, você não precisa se preocupar com a implementação do GetHashCode. Por exemplo:
fonte
Eu tentei várias abordagens mencionadas aqui. A maioria envolve serializar seus objetos e fazer uma comparação de cadeias. Embora super fácil e geralmente muito eficaz, descobri que fica um pouco curto quando você tem uma falha e algo assim é relatado:
Descobrir onde estão as diferenças é uma dor para dizer o mínimo.
Com as comparações de gráficos de objetos do FluentAssertions (ou seja
a.ShouldBeEquivalentTo(b)
), você recupera isso:Isso é muito melhor. Adquira o FluentAssertions agora, você ficará feliz mais tarde (e, se você aprovar, também promova a resposta do dkl onde o FluentAssertions foi sugerido pela primeira vez).
fonte
Concordo com ChrisYoxall - implementar Equals no seu código principal apenas para fins de teste não é bom.
Se você estiver implementando o Equals porque alguma lógica do aplicativo exige, tudo bem, mas mantenha o código apenas de teste fora do material (também a semântica de verificar o mesmo para teste pode ser diferente do que o aplicativo requer).
Em resumo, mantenha o código somente de teste fora da sua classe.
Uma comparação simples e superficial de propriedades usando reflexão deve ser suficiente para a maioria das classes, embora seja necessário recuar se seus objetos tiverem propriedades complexas. Se seguir as referências, tenha cuidado com referências circulares ou similares.
Sly
fonte
As restrições de propriedade , adicionadas no NUnit 2.4.2, permitem uma solução mais legível que a original do OP e produz mensagens de falha muito melhores. Não é de forma alguma genérico, mas se você não precisar fazer isso para muitas classes, é uma solução muito adequada.
Não é tão genérico quanto a implementação,
Equals
mas fornece uma mensagem de falha muito melhor do quefonte
A solução JSON de Max Wikstrom (acima) faz mais sentido para mim, é curta, limpa e, o mais importante, funciona. Pessoalmente, eu preferiria implementar a conversão JSON como um método separado e colocar a afirmação novamente dentro do teste de unidade como este ...
MÉTODO DE AJUDA:
TESTE DE UNIDADE :
FYI - Pode ser necessário adicionar uma referência ao System.Web.Extensions na sua solução.
fonte
Esta é uma discussão bastante antiga, mas eu queria saber se há uma razão pela qual nenhuma resposta proposta
NUnit.Framework.Is.EqualTo
eNUnit.Framework.Is.NotEqualTo
?Tal como:
e
fonte
Outra opção é escrever uma restrição personalizada implementando a
Constraint
classe abstrata NUnit . Com uma classe auxiliar para fornecer um pouco de açúcar sintático, o código de teste resultante é agradavelmente conciso e legível, por exemploPara um exemplo extremo, considere a classe que possui membros 'somente leitura', não é
IEquatable
, e você não pode alterar a classe em teste, mesmo se quiser:O contrato para a
Constraint
classe exige que você substituaMatches
eWriteDescriptionTo
(no caso de uma incompatibilidade, uma narrativa para o valor esperado), mas também substituaWriteActualValueTo
(narrativa para o valor real) faça sentido:Além da classe auxiliar:
Exemplo de uso:
fonte
Gostaria de aproveitar a resposta de @Juanma. No entanto, acredito que isso não deve ser implementado com asserções de teste de unidade. Este é um utilitário que pode muito bem ser usado em algumas circunstâncias por código que não é de teste.
Eu escrevi um artigo sobre o assunto http://timoch.com/blog/2013/06/unit-test-equality-is-not-domain-equality/
Minha proposta é a seguinte:
Usando isso com NUnit
gera a seguinte mensagem na incompatibilidade.
fonte
https://github.com/kbilsted/StatePrinter foi escrito especificamente para despejar gráficos de objetos na representação de cadeias com o objetivo de escrever testes de unidade fáceis.
Dado
Você pode, de uma maneira segura, e usando o preenchimento automático do visual studio incluir ou excluir campos.
fonte
Basta instalar o ExpectedObjects a partir do Nuget, você pode comparar facilmente o valor da propriedade de dois objetos, cada valor da coleção, o valor de dois objetos compostos e o valor parcial da propriedade de comparação por tipo anônimo.
Eu tenho alguns exemplos no github: https://github.com/hatelove/CompareObjectEquals
Aqui estão alguns exemplos que contêm cenários de comparação de objetos:
Referência:
fonte
Dê uma olhada no seguinte link. É uma solução do projeto de código e eu também a usei. Funciona bem para comparar os objetos.
http://www.codeproject.com/Articles/22709/Testing-Equality-of-Two-Objects?msg=5189539#xx5189539xx
fonte
Acabei escrevendo uma fábrica de expressões simples:
e apenas use-o:
É muito útil, pois tenho que comparar a coleção desses objetos. E você pode usar esse comparere em outro lugar :)
Aqui está uma lista com o exemplo: https://gist.github.com/Pzixel/b63fea074864892f9aba8ffde312094f
fonte
Desserialize as duas classes e faça uma comparação de cadeias.
EDIT: Funciona perfeitamente, esta é a saída que recebo do NUnit;
EDIÇÃO DOIS: Os dois objetos podem ser idênticos, mas a ordem em que as propriedades são serializadas não é a mesma. Portanto, o XML é diferente. DOH!
EDIÇÃO TRÊS: Isso funciona. Estou usando nos meus testes. Mas você deve adicionar itens às propriedades da coleção na ordem em que o código em teste os adiciona.
fonte
Sei que essa é uma pergunta muito antiga, mas o NUnit ainda não tem suporte nativo para isso. No entanto, se você gosta de testes no estilo BDD (ala Jasmine), ficaria agradavelmente surpreendido com o NExpect ( https://github.com/fluffynuts/NExpect , obtenha-o no NuGet), que possui testes de igualdade profunda instalados ali .
(aviso: sou o autor do NExpect)
fonte
Stringify e compare duas strings
Assert.AreEqual (JSON.stringify (LeftObject), JSON.stringify (RightObject))
fonte
fonte