C# 当AutoFixture实例化一个TBase时,我如何告诉它始终创建TDerived?
我有一个深度嵌套的对象模型,其中一些类可能看起来有点像这样:C# 当AutoFixture实例化一个TBase时,我如何告诉它始终创建TDerived?,c#,autofixture,C#,Autofixture,我有一个深度嵌套的对象模型,其中一些类可能看起来有点像这样: class TBase { ... } class TDerived : TBase { ... } class Container { ICollection<TBase> instances; ... } class TopLevel { Container container1; Container container2; ... } …但这不起作用,因为Customi
class TBase { ... }
class TDerived : TBase { ... }
class Container
{
ICollection<TBase> instances;
...
}
class TopLevel
{
Container container1;
Container container2;
...
}
…但这不起作用,因为Customize
中的lambda表达式是错误的。我猜有一种方法可以做到这一点,但AutoFixture似乎缺少文档,而不是作为开发人员博客上的意识流
有人能给我指出正确的方向吗?使用该方法告诉AutoFixture如何创建特定类型的实例
fixture.Register<TBase>(() => new TDerived());
fixture.Register(()=>newtderived());
或者,正如@sgnsajgon所指出的:
fixture.Register<TBase>( fixture.Create<TDerived> );
fixture.Register(fixture.Create);
虽然dcastro的答案也是一个选项,但最安全的选项是使用该类
您还可以编写:fixture.Register(fixture.Create)@谢天谢地,我在答案中加了一句:)谢谢,这很有效+1.然而,很难与马克·希曼争辩,所以我接受了他的“更正确”的答案。@GaryMcGill你做得对,我甚至不知道关于
TypeRelay
:)谢谢。我真希望那是有记录的…:-)它是::)所以,“文档”是:“将对类型的请求转换为对类型的请求”,这实际上并没有让它听起来那么有用:-)但我更广泛的观点是,如果你不知道到哪里去查找,就无法找到这些稀少的信息,或者通读整个API—就像使用字典查找一个你不知道如何拼写的单词一样。需要有一个更完整的教程或备忘单,否则99%的潜在用户群将被推迟到第一个关卡,这将是一个真正的耻辱,考虑到显然付出了大量的努力。我希望我不会听起来忘恩负义-无论是对于答案,还是从一开始图书馆的实际开发。在这两种情况下,我都很感谢您的时间——我只是认为多一点文档可能会带来巨大的不同——这可能意味着您花更少的时间回答这样的问题:——)我不是真的在争论,您的观点被很好地理解了。这是OSS永远存在的问题:没有人愿意编写文档。不过,AutoFixture确实接受拉动请求:)
fixture.Register<TBase>( fixture.Create<TDerived> );
fixture.Customizations.Add(
new TypeRelay(
typeof(TBase),
typeof(TDerived));