如何告诉AutoFixture在实例化TBase时始终创建TDerived?

Gar*_*ill 12 c# autofixture

我有一个深度嵌套的对象模型,其中一些类可能看起来像这样:

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)

  • 我不是在争论,你的观点很好.这是OSS的永久性问题:没有人想写文档.AutoFixture确实接受拉取请求,但:) (4认同)

dca*_*tro 9

使用该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)

  • 你也可以写:fixture.Register <TBase>(fixture.Create <TDerived>); (2认同)