2012-04-18 20 views
13

Digamos que tengo interfaz:AutoFixture e interfaces

public interface IFoo 
{ 
    int Bar1 { get; set; } 
    int Bar2 { get; set; } 
} 

Si IFoo era de clase, podría escribir:

fixture.CreateAnonymous<IFoo>(); 

y el resultado tendrán números establecidos para Bar1 y Bar2.

¿Pero cómo hacer esto con la interfaz? Traté de usar AutoMoqCustomization, pero esto parece ser para propiedades con tipo de interfaz y no interfaces en sí.

Estoy buscando una forma automática como CreateAnonymous es para las clases. Currenlty Estoy creando simulacros de interfaz y configurando sus propiedades explícitamente, que es el trabajo que me gustaría guardar. Debo perderme algo obvio.

+1

Así es cómo hacerlo funcionar: http://blog.ploeh.dk/2013/04/08/how-to-automatically-populate-properties-with-automoq –

Respuesta

12

Si desea map an interface to a specific concrete class, que sin duda puede hacer eso:

fixture.Register<IFoo>(() => fixture.CreateAnonymous<ConcreteFoo>()); 

(O fixture.Register<IFoo>(fixture.CreateAnonymous<ConcreteFoo>) para abreviar)

Sin embargo, AutoMoq (así como AutoRhinoMocks y AutoFakeItEasy) es también una opción. Con eso, un intento de crear una instancia de IFoo devolverá un proxy creado por Moq que implementa IFoo.

Sin embargo, con Moq no va a ver el Bar1 y Bar2 poblado. Eso no es solo porque AutoFixture no invoca a los instaladores, sino porque Moq no (de forma predeterminada) implementa los getters.

Para que funcione para Moq, se necesita invocar SetupAllProperties() en el propio Mock<T>. Mientras sea posible, eso es un poco difícil de hacer en el gráfico AutoMoq actual. Ya hay un work item para esto, pero si lee el debate verá que el problema es más complejo de lo que parece.

En cualquier caso, las interfaces con propiedades son una mala idea por varias otras razones también, por lo que la mejor solución es rediseñar la interfaz para que no tenga propiedades.

+3

"interfaces con propiedades es una mala idea" - ¿Siempre? Si es así, ¿podría darme un enlace? :) – Pol

+2

Muchas razones. La Ley de Demeter es uno de ellos: http://en.wikipedia.org/wiki/Law_of_Demeter Permítanme preguntar algo a cambio: ¿qué beneficio proporciona una interfaz con propiedades? –

+0

Estoy familiarizado con la Ley de Demeter. Utilizo propiedades (en 90% casos de solo lectura) para entidades, pero solo para algunos subconjuntos de datos, solo porque Law of Demeter no es para todos los datos. Aún así, a veces son útiles. – Pol

Cuestiones relacionadas