IList parametro del costruttore e AutoFixture
-
01-10-2019 - |
Domanda
autofixture , sto cercando di costruire un'istanza anonima di Project
:
_f=new Fixture().Customize(new AutoMoqCustomization());
_p=_f.CreateAnonymous<Project>();
Questa non riesce, causa Project
costruttore pubblico richiede IList<Partner>
public Project(/*.....*/,IList<Partner> partners){
Guard.AgainstEmpty(partners);
}
Analisi dello stack non è significativa (almeno - per me). Solo un po 'di riflessione bla-bla:
non riuscito: System.Reflection.TargetInvocationException: eccezione è stata generata dalla destinazione di una chiamata
. ---- System.ArgumentException: valore non rientra nel range previsto
. a System.RuntimeMethodHandle._InvokeConstructor (metodo IRuntimeMethodInfo, Object [] args, SignatureStruct e firma, RuntimeType DeclaringType)
-? Come assicurarsi passses autoFixture a raccolta anonima di partner al fine di costruirlo
Non è colpa di IList<Partners>
. C'è un altro parametro chiamato Priority
. Priority
a sua volta detiene Measure
, Measure
detiene IList<Indicator>
e chiama Guard.AgainstEmpty(indicators)
nel costruttore.
Quindi sembra qualcosa di simile:
fixture.CreateAnonymous<Foo>(); //kaboom!
public class Foo{
public Foo(IList<Bar> bars){
Guard.AgainstEmpty(bars); //just checks count for ienumerable & throws if 0
Bars=bars;
}
public IList<Bar> Bars {get;private set;} //should be readonly collection...
}
public class Fizz{
public Fizz(Foo foo){
Foo=foo;
}
public Foo{get;private set;}
}
public class Bar{}
Edilizia non riesce in modo Guard.AgainstEmpty
. Quindi - la questione diventa - come assicurarsi AutoFixture riempie alcuni bar in bar collezione prima di costruire foos
Soluzione
Questo aiuta. Navigazione fonte spesso aiuta .
var indicators=_f.CreateMany<Indicator>();
_f.Register<IList<Indicator>>(()=>indicators.ToList());
Ci potrebbe essere migliore modo però.
In generale, questo è come appare in questo momento:
_f=new Fixture().Customize(new AutoMoqCustomization());
var indicators=_f.CreateMany<Indicator>();
_f.Register<IList<Indicator>>(()=>indicators.ToList());
var regionName=_f.CreateAnonymous<string>();
_f.Register<string,Country,bool,Region>((name,country,call)=>
new Region(regionName,_f.CreateAnonymous<Country>(),true));
_c.Set(x=>x.Regions,_f.CreateMany<Region>().ToList());
_f.Register<IList<ManagementBoardEntry>>(()=>
_f.CreateMany<ManagementBoardEntry>().ToList());
_f.Register<IList<FinancialInfoEntry>>(()=>
_f.CreateMany<FinancialInfoEntry>().ToList());
_f.Register<IList<Partner>>(()=>_f.CreateMany<Partner>().ToList());
_p=_f.CreateAnonymous<Project>();
non può chiamare quella bella (qualche suggerimento refactoring sono i benvenuti), ma è ancora molto meglio che scrivere tutto manualmente.
Utilizzando IList
v'è una scelta sbagliata di sicuro. Peggio ancora - sto usando IList
per le proprietà troppo. Questo cliente invita a utilizzare direttamente invece di passare attraverso radice aggregata.
C'è uno svantaggio quando si utilizza params
. Non è possibile utilizzare più di un (a meno che non mi manca ancora alcuni principi fondamentali). E sto elenco ricevere in ingresso (parte del foglio di Excel DOM), non possono sapere fase di compilazione quanta elementi saranno lì.
Modello è veramente fresco. Just baked esso (quindi non c'è grande possibilità che mi sbaglio su tali controlli vuoto, parlerà con il cliente e Business Analyst che circa).
mia strategia è liberamente scultura e spingerla verso stato desiderato con test di unità. Questa è la ragione vera non mi piace rigorosa po TDD a. Si ruba attenzione, mi costringe a pensare a particolari invece di tutto il quadro un po troppo presto. Io preferisco di delineare e perfezionare fino a quando si guarda bene. Ma che potrebbe essere perche 'sono abbastanza per non fluente con il test.
In ogni caso - grazie per grandi punte. Continuerò a saperne di più su AutoFixture.