2012-02-18 3 views
6

quiero ser capaz de comparar los dos siguientes objetos de imagen utilizando AutoFixture.SemanticComparison:AutoFixture Semejanza - sólo se compare a juego propiedades

public class Object1 
{ 
    public int a; 
} 

public class Object2 
{ 
    public int a; 
    public int b; 
} 

Ahora, cuando lo haga de esta manera:

var o1 = new Object1 { a = 1 }; 
var o2 = new Object2 { a = 1, b = 2}; 
o1.AsSource().OfLikeness<Object2>().ShouldEqual(o2); 

Recibo la siguiente excepción: "Los siguientes miembros no coinciden: - b."

descubrí que puedo omitir el miembro de 'b' de esta manera:

var o1 = new Object1 { a = 1 }; 
var o2 = new Object2 { a = 1, b = 2}; 
o1.AsSource().OfLikeness<Object2>().Without(object2 => object2.b).ShouldEqual(o2); 

Sin embargo, me parece que esto es bastante engorroso, porque cada vez que añadir un nuevo miembro a la clase Object2, tengo que corregir las pruebas de mi unidad (o al menos los ayudantes de prueba de la unidad).

¿Hay alguna manera de decir "Quiero comparar para la semejanza solo para el subconjunto que existe en ambos objetos"?

Respuesta

7

Parece que desea comparar dos objetos según la intersección de sus propiedades. Esto no es actualmente compatible con la clase de Semejanza. El razonamiento es este:

En este momento, el tipo de destino (en el ejemplo anterior, que sería Object2) es la plantilla decisiva sobre la que se realiza la coincidencia. Esto proporciona una declaración muy fuerte para una aserción: cada propiedad pública o campo de esta clase debe coincidir.

Sin embargo, una declaración sobre la correspondencia de la intersección de las propiedades sería una muy débil declaración, porque eso podría ser intersección vacía. Esto podría resultar en False Negatives.

Incluso si está TDDing y sigue el ciclo Rojo/Verde/Refactor y ha visto una prueba de unidad que falla con una intersección hipotética de Semejanza, las refactorizaciones posteriores pueden convertir dicha afirmación en una Falsa Negativa, al eliminar la última propiedad o campo que los dos objetos tienen en común, y nunca lo notarás.

Sin embargo, AutoFixture es de código abierto y todo, por lo que le invitamos a suggest this feature o enviar una solicitud de extracción.

+1

El argumento que describió es bastante sólido. Me llevó a pensar en lo que es más engorroso: agregar nuevas propiedades a Without() o rastrear los dos objetos para cambiar los nombres de propiedad para evitar falsos positivos. ¡Gracias por dirigir mi atención a esto! –