我怎样才能告诉自动固定装置在实例化TBase时始终创建TDerived
本文关键字:TBase 实例化 装置 TDerived 创建 | 更新日期: 2023-09-27 18:32:56
我有一个深度嵌套的对象模型,其中一些类可能看起来像这样:
class TBase { ... }
class TDerived : TBase { ... }
class Container
{
ICollection<TBase> instances;
...
}
class TopLevel
{
Container container1;
Container container2;
...
}
我想创建我的顶级对象作为测试装置,但我希望所有TBase
实例(例如上面的instances
集合(都是TDerived
的实例,而不是TBase
。
我想我可以简单地使用以下内容来做到这一点:
var fixture = new Fixture();
fixture.Customize<TBase>(c => c.Create<TDerived>());
var model = this.fixture.Create<TopLevel>();
。但这不起作用,因为 Customize
中的 lambda 表达式是错误的。我猜有一种方法可以做到这一点,但AutoFixture似乎缺乏文档,除了作为开发人员博客上的意识流。
谁能指出我正确的方向?
虽然dcastro的答案也是一种选择,但最安全的选择是使用TypeRelay类。
fixture.Customizations.Add(
new TypeRelay(
typeof(TBase),
typeof(TDerived));
使用 Register
方法告诉 AutoFixture 如何创建特定类型的实例。
fixture.Register<TBase>(() => new TDerived());
或者,正如@sgnsajgon所指出的:
fixture.Register<TBase>( fixture.Create<TDerived> );