使用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
本身拥有Measure
,Measure
拥有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集合中的一些条形图?
答案 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的更多信息。