2014-12-02 6 views
11

mam głęboko zagnieżdżony model obiektowy, gdzie niektóre klasy może wyglądać trochę tak:Jak mogę nakazać AutoFixture, aby zawsze tworzyć TDerived, gdy tworzy instancję TBase?

class TBase { ... } 

class TDerived : TBase { ... } 

class Container 
{ 
    ICollection<TBase> instances; 
    ... 
} 

class TopLevel 
{ 
    Container container1; 
    Container container2; 
    ... 
} 

Chciałbym utworzyć mojego obiektu najwyższego poziomu w urządzeniu testowym, ale chcę wszystkich TBase instancje (takie jak w zbiorze instances powyżej) zamiast instancji TDerived zamiast TBase.

Myślałem, że mogę to zrobić po prostu używając coś takiego:

var fixture = new Fixture(); 

fixture.Customize<TBase>(c => c.Create<TDerived>()); 

var model = this.fixture.Create<TopLevel>(); 

... ale to nie działa, ponieważ wyrażenie lambda w Customize jest źle. Zgaduję, że istnieje sposób, aby to zrobić, ale AutoFixture wydaje się brakować dokumentacji, innej niż strumień świadomości na blogu programisty.

Czy ktoś może wskazać mi właściwy kierunek?

Odpowiedz

8

Chociaż odpowiedź przez dcastro jest również opcja, najbezpieczniejszym rozwiązaniem jest użycie klasy TypeRelay.

fixture.Customizations.Add(
    new TypeRelay(
     typeof(TBase), 
     typeof(TDerived)); 
+1

Dzięki. Chciałbym, żeby to było udokumentowane ... :-) –

+0

To jest: http://www.nudoq.org/#!/Packages/AutoFixture/Ploeh.AutoFixture/TypeRelay :) –

+0

Tak więc "dokumentacja" to: " Przekazuje żądanie Typu na żądanie typu ", co w rzeczywistości nie sprawia, że ​​brzmi to użytecznie :-) Ale moim szerzej jest to, że nie ma możliwości znalezienia nawet tej skąpej informacji, chyba że albo wiesz, gdzie szukać, lub przeczytać cały API - to tak, jak przy użyciu słownika, aby wyszukać słowo, którego nie znasz. Musi istnieć pełniejszy samouczek lub arkusz do cheatowania, w przeciwnym razie 99% twojej potencjalnej bazy użytkowników zostanie odepchnięte od pierwszej przeszkody, co byłoby prawdziwym wstydem, biorąc pod uwagę wysiłek, który oczywiście w nią włożył. –

7

Użyj metody Register, aby poinformować AutoFixture o tworzeniu wystąpień określonego typu.

fixture.Register<TBase>(() => new TDerived()); 

lub, jak podkreślił @sgnsajgon:

fixture.Register<TBase>(fixture.Create<TDerived>); 
+2

Ponadto można napisać: fixture.Register (fixture.Create ); – sgnsajgon

+0

@sgnsajgon Miło, dodałem, że do odpowiedzi :) – dcastro

+0

Dzięki, że działało. +1. Trudno jednak dyskutować z Markiem Seemannem, więc zaakceptowałem jego "bardziej poprawną" odpowiedź. –

Powiązane problemy