2014-04-10 8 views
5

Ho appena iniziato a utilizzare AutoFixture e sto recuperando le basi (da quello che vedo c'è molto di più) ma sto avendo un problema e non sono 100 % sicuro di quale sia la migliore pratica per cose come questa.Compilazione di una raccolta Proprietà di un faro con autofocus

Sto testando un controller e parte del processo è che l'azione può restituire una delle due viste.

  • Se una categoria ha dei figli - mostra la vista Elenco categorie
  • Se una categoria non ha figli mostrare il prodotto messa in vendita di vista

Così sto pensando di alcuni test per quel comportamento, ma i dati del dispositivo restituiti sarebbero diversi. Uno restituirebbe un conteggio di 0, l'altro un conteggio maggiore di zero, quindi vorrei che l'apparecchio mi aiutasse con quello.

Mi sono guardato intorno, e forse dovevo creare una personalizzazione di qualche tipo, ma speravo che l'API di base potesse aiutarmi qui. Ho provato questo:

var category = _fixture.Build<Category>() 
    .Do(x => x.SubCategories = _fixture.CreateMany<Category>(3).ToList()) 
    .Create(); 

_fakeCategoryService 
    .Setup(x => x.GetById(id)) 
    .Returns(category); 

Questo compila e test eseguiti (e non riescono), ma le sottocategorie ha sempre un conteggio di 0, quindi sto pensando il mio invito a creare molti in Do è tutto sbagliato (kinda sembra sbagliato ma non sono ancora sicuro di cosa debba essere sostituito con).

UPDATE: dovrebbe leggere il cheat sheet un po 'meglio!

var category = _fixture.Build<Category>() 
    .With(x => x.SubCategories, _fixture.CreateMany<Category>(3).ToList()) 
    .Create(); 

questo funziona, se c'è un modo migliore per favore fatemelo sapere.

risposta

5

Sì, Build è corretto.


Se si desidera personalizzare l'algoritmo di creazione per un singolaCategory uso Build:

var actual = fixture 
    .Build<Category>() 
    .With(x => x.SubCategories, 
     fixture.CreateMany<Category>().ToList()) 
    .Create(); 

Assert.NotEmpty(actual.SubCategories); 

Se si desidera personalizzare l'algoritmo di creazione per tuttiCategory casi usano Customize:

fixture.Customize<Category>(c => c 
    .With(x => x.SubCategories, 
     fixture.CreateMany<Category>().ToList())); 

var actual = fixture.Create<Category>(); 

Assert.NotEmpty(actual.SubCategories); 
+0

Grazie per le informazioni aggiunte, molto apprezzato! – Modika

5

sperava l'API di base potrebbe aiutarmi qui

Non si risolve il problema, se si sa come ascoltare :) AutoFixture è stato originariamente costruito come uno strumento per Test-Driven Development (TDD), e TDD è tutto su feedback. Nello spirito di GOOS, dovresti leggere per ascoltare i tuoi test. In questo caso è lo stesso del Framework Design Guidelines:

DO NOT provide settable collection properties.

Invece di assegnare un all'ingrosso lista a una proprietà, in considerazione

  • rendendo la proprietà della raccolta di sola lettura, e lasciare che i clienti invocano Add, ecc
  • prendendo la collezione come un parametro del costruttore, invece di proprietà mutanti

In quest'ultimo caso, AutoFixture fornirà automaticamente una raccolta popolata quando invoca il costruttore, anche se in questo caso caso articolare, poiché si dispone di un grafico potenzialmente ricorsivo, potrebbe essere necessario explicitly handle it.

Nel primo caso, AutoFixture non fa nulla, fuori dalla scatola, ma ha un metodo di AddManyTo di estensione, che consente di compilare una collezione in una singola istruzione:

fixture.AddManyTo(category.SubCategories); 
+0

Intendevo che stavo sbagliando non l'API era sbagliato :) Grazie per le informazioni aggiuntive, darò un'occhiata in esso. Penso di aver visto un esempio della funzione AddManyTo sul tuo blog! – Modika

+0

Ciao Mark, questa app non è la più grande quindi la classe Category è la classe utilizzata per EF quindi non credo (dovremo controllare di nuovo) che puoi lavorare senza che sia una proprietà impostabile. Per un oggetto dominio puro ti prendo. – Modika

+0

È passato molto tempo da quando ho utilizzato EF, ma credo che tu abbia ragione:/ –

Problemi correlati