es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Fluent Assertions 6: Comparando dos colecciones con diferentes tipos y nombres de miembros.

En las versiones anteriores de Fluent Assertions, había una posibilidad de comparar dos colecciones con diferentes tipos y nombres de miembros creando una clase que implementa IEquivalencyStep:
https://stackoverflow.com/a/55898570

Desafortunadamente, la versión 6 cambió esta interfaz y el truco no funciona. ¿Existe alguna solución alternativa para este tipo de comparación en la versión actual de Fluent Assertions?

Tags:  ,

Answer

  1. Avatar for davy.ai

    A partir de la versión 6 de Fluent Assertions, el enfoque IEquivalencyStep para comparar colecciones con tipos y nombres de miembros diferentes ya no es válido. Sin embargo, hay soluciones alternativas disponibles.

    Una solución alternativa es utilizar el método Using para especificar una estrategia personalizada de selección de propiedades, lo que le permite controlar qué propiedades se comparan. Por ejemplo, si tiene dos colecciones collection1 y collection2 con tipos y nombres de miembros diferentes, podría compararlos de esta manera:

    collection1.Should().BeEquivalentTo(collection2, options => options
        .Using<><object>>(ctx => ctx.Subject.Should().BeEquivalentTo(ctx.Expectation))
        .WhenTypeIs<ienumerable>()
        .Select(type => type.GetProperty("Value")));
    

    Este código indica a Fluent Assertions que utilice el método existente BeEquivalentTo para comparar propiedades IEnumerable<object>, y que solo compare propiedades con el nombre “Value”.

    Otra solución alternativa es usar una regla de aserción personalizada IAssertionRule, que permite implementar lógica de comparación personalizada para tipos específicos. Por ejemplo, podría crear una regla que compare objetos MyType con base en una propiedad específica:

    public class MyTypeComparer : IAssertionRule
    {
        public bool AssertEquality(ComparisonContext context)
        {
            // Comparar objetos MyType en función de una propiedad específica
            if (context.Subject es MyType subject && context.Expectation es MyType expectation)
            {
                return subject.MyProperty == expectation.MyProperty;
            }
    
            // Si los tipos no coinciden, continuar con la comparación predeterminada
            return false;
        }
    }
    

    Luego, puede registrar la regla con Fluent Assertions de esta manera:

    FluentAssertions.AssertionOptions.AssertEquivalencyUsing(options => options
        .Using(new MyTypeComparer())
        .WhenTypeIs<mytype>());
    

    Este código indica a Fluent Assertions que utilice la regla MyTypeComparer para comparar objetos MyType.

    Ambas soluciones alternativas le permiten personalizar la lógica de comparación para escenarios específicos donde la comparación predeterminada no funciona.

Comments are closed.