我有一个深度嵌套的对象模型,其中一些类可能看起来像这样:
class TBase { ... }
class TDerived : TBase { ... }
class Container
{
ICollection<TBase> instances;
...
}
class TopLevel
{
Container container1;
Container container2;
...
}
Run Code Online (Sandbox Code Playgroud)
我想将我的顶级对象创建为测试夹具,但我希望所有TBase实例(例如instances上面的集合中)都是实例TDerived而不是TBase.
我以为我可以简单地使用以下内容来做到这一点:
var fixture = new Fixture();
fixture.Customize<TBase>(c => c.Create<TDerived>());
var model = this.fixture.Create<TopLevel>();
Run Code Online (Sandbox Code Playgroud)
...但是这不起作用,因为lambda表达式Customize是错误的.我猜测有一种方法可以做到这一点,但AutoFixture似乎缺乏文档,而不是开发人员博客上的意识流.
谁能指出我正确的方向?
Mar*_*ann 11
虽然dcastro的答案也是一个选项,但最安全的选择是使用TypeRelay类.
fixture.Customizations.Add(
new TypeRelay(
typeof(TBase),
typeof(TDerived));
Run Code Online (Sandbox Code Playgroud)
使用该Register方法告诉AutoFixture如何创建特定类型的实例.
fixture.Register<TBase>(() => new TDerived());
Run Code Online (Sandbox Code Playgroud)
或者,正如@sgnsajgon所指出的那样:
fixture.Register<TBase>( fixture.Create<TDerived> );
Run Code Online (Sandbox Code Playgroud)