Frage

Mit autofixture , ich versuche anonyme Instanz von Project zu konstruieren:

 _f=new Fixture().Customize(new AutoMoqCustomization());
 _p=_f.CreateAnonymous<Project>();

Dies schlägt fehl, weil Project öffentlichen Konstruktor verlangt IList<Partner>

public Project(/*.....*/,IList<Partner> partners){
  Guard.AgainstEmpty(partners);
}

Stack-Trace ist nicht sinnvoll (zumindest - für mich). Nur einige Reflexion bla-bla:

fehlgeschlagen: System.Reflection.TargetInvocationException: Ausnahme wurde durch das Ziel für einen Aufruf ausgelöst
. ---- System.ArgumentException: Wert nicht innerhalb des erwarteten Bereichs
. bei System.RuntimeMethodHandle._InvokeConstructor (IRuntimeMethodInfo Methode, Object [] args, SignatureStruct & Signatur, Runtime DeclaringType)

So - wie man sicherstellen, dass autoFixture passses in anonymer Sammlung von Partnern, um es zu konstruieren


Es ist nicht fehler von IList<Partners>. Es gibt einen weiteren Parameter namens Priority. Priority selbst hält Measure, Measure hält IList<Indicator> und ruft Guard.AgainstEmpty(indicators) in Konstruktor.

So ist es etwa wie folgt aussieht:

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{}

Ausbau nicht in Guard.AgainstEmpty Methode. So - wird die Frage - wie sicher AutoFixture machen füllt einige Bars in Bars Sammlung vor foos Konstruktion

War es hilfreich?

Lösung

Das hilft. Browsing Quelle oft hilft .

var indicators=_f.CreateMany<Indicator>();
_f.Register<IList<Indicator>>(()=>indicators.ToList());

Es könnte allerdings besser so sein.


Insgesamt ist dies, wie es im Moment aussieht:

  _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>();

Kann nicht nennen das schöne (alle Refactoring Vorschläge sind willkommen), aber es ist immer noch viel besser als alles von Hand zu schreiben.


Mit IList gibt es eine falsche Wahl sicher. Schlimmer noch - ich verwende IList Objekte auch. Das Client lädt ein, sie zu benutzen, sondern direkt durch Aggregat Wurzel gehen.

Es ist ein Nachteil bei der Verwendung von params. Kann nicht mehr als ein verwenden (es sei denn, ich einige Grundlagen wieder bin fehlt). Und ich empfange Liste als Eingang (Teil des Blattes DOMS Excel), kann nicht wissen, Kompilierung, wie viele Elemente da sein werden.

Modell ist wirklich frisch. gebacken es einfach (es so ist große Chance, dass ich über diese Leeren Kontrollen falsch bin, wird mit Kunden und Business-Analysten darüber reden).

ist meine Strategie frei Skulptur sie und schieben Sie ihn nach gewünschtem Zustand mit Unit-Tests. Dies ist tatsächlich Grund, warum ich strenge TDD etwas nicht mögen. Es stiehlt Fokus, zwingt mich über Details, anstatt ganzen Bildes zu denken, ein bisschen zu früh. Ich ziehe es zu skizzieren und zu verfeinern, bis es gut aussieht. Aber das könnte sein, weil ich nicht fließend genug bin mit zu testen.

Wie auch immer - danke für gute Tipps. Ich werde auch weiterhin mehr über AutoFixture erfahren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top