Autofixture: SemanticComparison: semejanza de dos colecciones secundarias

Creado en 21 jun. 2017  ·  13Comentarios  ·  Fuente: AutoFixture/AutoFixture

Estoy seguro de que esto se ha preguntado antes, lo busqué en Google y encontré algunas soluciones complejas, pero aquí va de todos modos. Tengo dos objetos complejos de exactamente el mismo tipo y quiero compararlos; sin embargo, contienen una colección de elementos que también deben compararse, pero quiero ignorar el orden. ¿Es esto posible con SemanticComparison? Actualmente estoy usando un mecanismo de comparación json, pero depurar esto cuando las comparaciones fallan es una pesadilla. Parecía usar la semejanzala clase de inmediato iba a arreglar esto, pero se cagó en las colecciones a pesar de que contenían elementos idénticos.

question

Comentario más útil

Para estos escenarios, he usado https://github.com/jmansar/SemanticComparisonExtensions con gran efecto. Con eso, puedo controlar las semejanzas internas y modificar un poco las cosas.

También es una excelente manera de configurar rápidamente comparaciones anidadas complejas.

Todos 13 comentarios

¿Puede mostrarnos cómo se ve el objeto que está tratando de comparar?

Además, ¿ha intentado usar SemanticComparer<T> directamente como se muestra en este ejemplo? Esto es más flexible que usar Likeness<TSource, TDestination> .

El objeto tiene esta estructura:

public class SongDto
    {
        public string Lyrics { get; set; }
        public IEnumerable<TagDto> Tags { get; set; }
        public string FileName { get; set; }
        public string CustomPromoLink { get; set; }
        public string UPC { get; set; }
        public YoutubeVideoDto YouTubeVideo { get; set; }
    }

Las dos propiedades en las que tuvo problemas fueron la colección TagDto y YouTubeVideoDto, idealmente las atravesaría y seguiría comparando tan profundamente como fueran. De lo contrario, me quedaré con mi comparador JSON, ya que esta forma de comparar me hará hacer un montón de trabajo de todos modos.

Tendría curiosidad por saber cómo ese comparador JSON maneja IEnumerable<TagDto> si es una secuencia infinita.

¿Cómo manejaría algo una secuencia infinita? Ciertamente no estoy diciendo que sea perfecto, y obviamente estoy buscando otra solución, de ahí la inmersión en SemanticComparison, pero si SC no puede manejar esta situación, entonces simplemente no veo el sentido de usarlo. Supongo que hay una manera de manejar esto, simplemente no pude encontrar una buena solución en las viejas interwebs.

Puede hacer algo similar a esto , usando un DelegatingMemberComparer que devuelve siempre True por IEnumerable<TagDto> o, incluso mejor, compara IEnumerable<TagDto> de la forma que desee .

(Vea la segunda y tercera instancia DelegatingMemberComparer en el enlace anterior).

Bien, gracias sinceramente por la ayuda.

Entonces, en esencia, todavía tengo que escribir un DelegatingMemberComparer personalizado para cada tipo. Entonces, la ventaja de usar la biblioteca es que, en una prueba fallida, me dice qué propiedades son diferentes.

Todavía tengo que escribir un DelegatingMemberComparer personalizado para cada tipo

  • Uno DelegatingMemberComparer para todos los tipos, que hace a. Es igual a (b) o incluso usa Likeness para ello
  • Uno DelegatingMemberComparer por IEnumerable<TagDto> como se muestra en el enlace de arriba

en una prueba fallida me dice qué propiedades son diferentes

No, eso es lo que hace Likeness ...

La semejanza usa SemanticComparer<T> internamente para comparar objetos ... Por lo tanto, si va a utilizar SemanticComparer<T> , puede ser más flexible, pero perderá la función de informes de la semejanza.

Si necesita el material de informes, es posible que pueda lograr algo similar utilizando la propia imagen With y EqualsWhen sintaxis como se muestra en este ejemplo.

Bien, ahora vuelvo a mi pregunta original, ¿qué obtengo de esta biblioteca si el material de informes ya no está allí (por lo que he leído, Likeness va a quedar obsoleto), y si escribo un DelegatingMemberComparer que hace un .Equals (b), va a hacer una comparación de referencia o tengo que anular el método Equals de cada objeto. ¿Está bien?

Entonces, ¿cuál es la ganancia sobre el uso de xUnit Assert con IEqualityComparers?

Solo me gustaría agregar que creo que AutoFixture es increíble, y pensé que SemanticComparer haría que mis afirmaciones fueran tan fáciles como mis configuraciones.

Intentaré proporcionar 3 ejemplos (Likeness, SemanticComparer, IEqualityComparer) para su SongDto para que podamos seguir discutiendo desde allí. Estoy abrumado de trabajo en este momento, por lo que podría llevarme un tiempo. ..

@moodmosaic ¡¡ Muchas gracias !! Y si desea señalarme algunos artículos que explican los porqués de SemanticComparer, tal vez eso me haga menos denso en este punto.

Para estos escenarios, he usado https://github.com/jmansar/SemanticComparisonExtensions con gran efecto. Con eso, puedo controlar las semejanzas internas y modificar un poco las cosas.

También es una excelente manera de configurar rápidamente comparaciones anidadas complejas.

@cvbarros ¡ Esas extensiones funcionaron de

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

malylemire1 picture malylemire1  ·  7Comentarios

ploeh picture ploeh  ·  3Comentarios

DeafLight picture DeafLight  ·  5Comentarios

mjfreelancing picture mjfreelancing  ·  4Comentarios

tomasaschan picture tomasaschan  ·  3Comentarios