我怎样才能告诉自动固定装置在实例化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似乎缺乏文档,除了作为开发人员博客上的意识流。

谁能指出我正确的方向?

我怎样才能告诉自动固定装置在实例化TBase时始终创建TDerived

虽然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> );