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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top