IList <something>构造函数参数和AutoFixture </something>

时间:2010-09-09 13:08:29

标签: c# unit-testing autofixture

使用autofixture,我正在尝试构建Project的匿名实例:

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

此操作失败,导致Project公共构造函数需求IList<Partner>

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

堆栈跟踪没有意义(至少对我而言)。只是一些反思yada-yada:

  

失败:System.Reflection.TargetInvocationException:调用目标抛出了异常。
  ---- System.ArgumentException:值不在预期范围内。
      在System.RuntimeMethodHandle._InvokeConstructor(IRuntimeMethodInfo方法,Object [] args,SignatureStruct&amp; signature,RuntimeType declaringType)

那么 - 如何确保autoFixture在匿名合作伙伴集合中传递以构建它?


这不是IList<Partners>的错。还有另一个名为Priority的参数。 Priority本身拥有MeasureMeasure拥有IList<Indicator>并在构造函数中调用Guard.AgainstEmpty(indicators)

所以它看起来像这样:

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

Guard.AgainstEmpty方法构建失败。那么 - 问题变成了 - 如何确保AutoFixture在构建foos之前填充了bar集合中的一些条形图?

1 个答案:

答案 0 :(得分:1)

这有帮助。浏览source通常有帮助。

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

可能有更好的方法。


总体而言,这就是目前的情况:

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

不能称之为漂亮(欢迎任何重构建议),但它仍然比手动编写所有内容要好得多。


使用IList肯定是错误的选择。更糟糕的是 - 我也在使用IList作为属性。这会邀请客户直接使用它们,而不是通过聚合根。

使用params时有一个缺点。不能使用多个(除非我再次遗漏一些基础知识)。我收到列表作为输入(excel表DOM的一部分),无法知道编译时间将有多少元素。

模特真的很新鲜。刚刚烘焙它(因此很有可能我对这些空白检查错了,会与客户和业务分析师讨论这个问题)。

我的策略是自由雕刻它并通过单元测试将其推向理想的状态。这是我不喜欢严格的TDD的实际原因。它偷走了焦点,迫使我过早地考虑细节而不是整个画面。我更喜欢草绘它并精炼直到它看起来很好。但这可能是因为我对测试不够流畅。

无论如何 - 谢谢你的好建议。我将继续了解有关AutoFixture的更多信息。