2014-12-02 7 views
11

Ho un modello a oggetti profondamente nidificato, in cui alcune classi potrebbe apparire un po 'come questo:Come posso dire a AutoFixture di creare sempre TDerived quando crea un'istanza di un TBase?

class TBase { ... } 

class TDerived : TBase { ... } 

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

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

mi piacerebbe creare il mio oggetto di livello superiore come un dispositivo di prova, ma voglio tutto il TBase istanze (ad esempio nella raccolta sopra instances) per essere istanze di TDerived anziché TBase.

ho pensato che avrei potuto fare questo semplicemente usando qualcosa come:

var fixture = new Fixture(); 

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

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

... ma questo non funziona, perché l'espressione lambda in Customize è sbagliato. Immagino che ci sia un modo per farlo, ma la correzione automatica sembra mancare di documentazione, se non come un flusso di coscienza sul blog dello sviluppatore.

Qualcuno può indicarmi la giusta direzione?

risposta

8

Mentre la risposta da dcastro è anche un'opzione, l'opzione più sicura è quella di utilizzare la classe TypeRelay.

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

Grazie. Mi auguro che sia stato documentato ... :-) –

+0

E ': http://www.nudoq.org/#!/Packages/AutoFixture/Ploeh.AutoFixture/TypeRelay :) –

+0

Quindi, la "documentazione" è: " Trasmette una richiesta per il Type in una richiesta per il Type ", che in realtà non lo rende così utile :-) Ma il mio punto più ampio è che non c'è modo di trovare anche questa informazione scarse a meno che tu non sappia dove cercare, o leggere l'intera API: è come usare un dizionario per cercare una parola che non si sa come si scrive. Ci deve essere un tutorial più completo o un cheat-sheet, altrimenti il ​​99% della tua potenziale base di utenti sarà rimandato al primo ostacolo, il che sarebbe un vero peccato, data la quantità di sforzo che ovviamente è andata a finire. –

7

Utilizzare il metodo Register per indicare a AutoFixture come creare istanze di un particolare tipo.

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

o, come ha sottolineato @sgnsajgon:

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

Inoltre è possibile scrivere: fixture.Register (fixture.Create ); – sgnsajgon

+0

@sgnsajgon Bello, l'ho aggiunto alla risposta :) – dcastro

+0

Grazie, ha funzionato. +1. Tuttavia, è difficile discutere con Mark Seemann, quindi ho accettato la sua risposta "più corretta". –

Problemi correlati