me encontré con una clase durante mi trabajo que tiene este aspecto:Crear un híbrido de un simulacro y un objeto anónimo utilizando, p. Moq y AutoFixture?
public class MyObject
{
public int? A {get; set;}
public int? B {get; set;}
public int? C {get; set;}
public virtual int? GetSomeValue()
{
//simplified behavior:
return A ?? B ?? C;
}
}
El tema es que tengo algo de código que tiene acceso A, B y C y llama al método GetSomeValue() (ahora, diría este no es un buen diseño, pero algunas veces tengo las manos atadas ;-)). Quiero crear un simulacro de este objeto que, al mismo tiempo, tiene A, B y C establecidos en algunos valores. Por lo tanto, cuando se utiliza el moq como tal:
var m = new Mock<MyObject>() { DefaultValue = DefaultValue.Mock };
me permite configurar un resultado en GetSomeValue() método, pero todas las propiedades se establecen en NULL (y la creación de todos ellos utilizando la Configuración() es bastante engorroso, ya que el objeto real es un objeto de datos desagradable y tiene más propiedades que en el ejemplo simplificado anterior).
Así que, por otro lado, el uso de AutoFixture así:
var fixture = new Fixture();
var anyMyObject = fixture.CreateAnonymous<MyObject>();
me deja sin la capacidad de STUP una llamada al método GetSomeValue().
¿Hay alguna forma de combinar los dos, tener valores anónimos y la capacidad de configurar los resultados de las llamadas?
Editar
Sobre la base de la respuesta de nemesv, que deriva el siguiente método de utilidad (espero que me dieron bien):
public static Mock<T> AnonymousMock<T>() where T : class
{
var mock = new Mock<T>();
fixture.Customize<T>(c => c.FromFactory(() => mock.Object));
fixture.CreateAnonymous<T>();
fixture.Customizations.RemoveAt(0);
return mock;
}
Esta es una buena solución, sobre todo porque cubre tipos anidados, sin embargo, para que sea más general con tipos anidados, ¿hay alguna manera de deshacerse de la pieza: t == typeof (MiObjeto) | | t == typeof (MyParent)? La lógica en la que estoy pensando es algo así como: "si el tipo anidado del híbrido es burlable, hágalo híbrido, de lo contrario, conviértalo en un valor anónimo". –
Sí, simplemente reemplace el predicado con algo más general. –
Gracias! Intenté usar un predicado de (t! = Null &&! T.IsPrimitive && (t.GetConstructors (BindingFlags.Public) .Length! = 0 || t.GetConstructor (Type.EmptyTypes)! = Null)) y parece ¡trabajar! ¿Puedes ver algo que falta aquí? Trataré de probarlo un poco e intentaré avisarte si sale algo. –