natknąłem klasę podczas mojej pracy, która wygląda tak:Tworzenie hybrydy próbnego i anonimowego obiektu za pomocą np. Moq i 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;
}
}
Problem jest, że mam jakiś kod, który uzyskuje dostęp do A, B i C oraz wywołuje metodę GetSomeValue() (obecnie, powiedziałbym to nie jest dobry projekt, ale czasami moje ręce są związane ;-)). Chcę stworzyć próbę tego obiektu, który jednocześnie ma ustawione wartości A, B i C. Tak więc, gdy używam MOQ jako takie:
var m = new Mock<MyObject>() { DefaultValue = DefaultValue.Mock };
pozwala mi setup wynik na GetSomeValue() metoda, ale wszystkie właściwości są ustawione na null (i konfigurowania wszystkich z nich za pomocą programu konfiguracji() jest dość kłopotliwe, ponieważ obiekt rzeczywisty jest nieprzyjemnym obiektem danych i ma więcej właściwości niż w powyższym uproszczonym przykładzie).
Więc z drugiej strony, przy użyciu AutoFixture tak:
var fixture = new Fixture();
var anyMyObject = fixture.CreateAnonymous<MyObject>();
pozostawia mnie bez możliwości stup wezwanie do GetSomeValue metoda().
Czy istnieje sposób na połączenie tych dwóch elementów, uzyskanie anonimowych wartości i możliwość ustawienia wyników połączeń?
Edit
podstawie odpowiedzi nemesv jest, że pochodzi z następującej metody użytkową (mam nadzieję, mam to po prawej):
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;
}
Jest to miłe rozwiązanie, szczególnie, ponieważ obejmuje zagnieżdżone typy jednak, aby była ona bardziej ogólnie z zagnieżdżonych typów, czy jest jakiś sposób, aby pozbyć się części: t == typeof (MyObject) | | t == typeof (MyParent)? Logika, o której myślę, to coś w rodzaju: "jeśli typ zagnieżdżony hybrydy jest możliwy do opanowania, uczyń z niego hybrydę, inaczej uczyń ją wartością anonimową". –
Tak, wystarczy zamienić predykat na coś bardziej ogólnego. –
Dzięki! Próbowałem użyć predykatu (t! = Null &&! T.IsPrimitive && (t.GetConstructors (BindingFlags.Public) .Length! = 0 || t.GetConstructor (Type.EmptyTypes)! = Null) i wydaje się pracować! Czy widzisz, że czegoś tu nie ma? Postaram się trochę przetestować i spróbować powiedzieć, czy coś wyjdzie. –