Pregunta

autofixture , estoy tratando de construir instancia anónima de Project:

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

Esta falla, causa Project constructor público exige IList<Partner>

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

Seguimiento de la pila no es significativo (al menos - para mí). Sólo un poco de reflexión yada yada-:

  

fallido: System.Reflection.TargetInvocationException: Se inició una excepción por el destino de una invocación
.   ---- System.ArgumentException: Valor no está dentro del rango esperado
.       en System.RuntimeMethodHandle._InvokeConstructor (método IRuntimeMethodInfo, Object [] args, SignatureStruct y firma, RuntimeType declaringType)

Por lo tanto -? Cómo hacer passses autoFixture seguro en la colección anónima de los socios con el fin de construirlo


No es culpa de IList<Partners>. Hay otro parámetro llamado Priority. Priority sí sostiene Measure, Measure sostiene IList<Indicator> y llama Guard.AgainstEmpty(indicators) en el constructor.

Por lo que se ve algo como esto:

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

Construcción falla en el método Guard.AgainstEmpty. Por lo tanto - la pregunta es - cómo asegurarse AutoFixture llena algunos bares en la recolección de barras antes de construir Foos

¿Fue útil?

Solución

Esto ayuda. Navegación por fuente menudo ayuda .

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

No podría ser mejor manera sin embargo.


En general, se trata de cómo se ve en la actualidad

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

No se puede llamar a ese hermoso (alguna sugerencia refactorización son bienvenidos), pero aún así es mucho mejor que escribir todo manualmente.


El uso de IList hay una elección equivocada seguro. Lo que es peor - Estoy usando IList de propiedades también. Ese cliente invita a usar directamente en vez de ir a través de la raíz agregado.

Hay un inconveniente cuando se utiliza params. No se puede usar más de un (a no ser que me falta algunos conceptos básicos de nuevo). Y estoy lista que recibe como entrada (parte del excel DOM hoja), no se puede saber cuánto tiempo de compilación elementos estarán allí.

El modelo es muy fresco. Sólo al horno que (por lo que existe una gran posibilidad de que estoy equivocado acerca de esos cheques vacío, hablará con el cliente y la empresa analista de eso).

Mi estrategia es libremente escultura y empujarla hacia el estado deseado con las pruebas unitarias. Esta es la razón real me gusta TDD un poco estricta. Roba enfoque, me obliga a pensar en los detalles en lugar de toda la imagen un poco demasiado pronto. Prefiero dibujar y perfeccionarlo hasta que se ve bien. Pero eso podría ser porque soy lo suficientemente no fluida con las pruebas.

De todos modos - gracias por grandes consejos. Voy a seguir para obtener más información sobre AutoFixture.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top