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

时间:2014-12-02 10:29:06

标签: c# autofixture

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

class TBase { ... }

class TDerived : TBase { ... }

class Container
{
    ICollection<TBase> instances;
    ...
}

class TopLevel
{
    Container container1;
    Container container2;
    ...
}

我想将我的顶级对象创建为测试夹具,但我希望所有TBase个实例(例如上面的instances集合)都是{的实例{1}}而不是TDerived

我以为我可以简单地使用类似的东西来做这件事:

TBase

...但这不起作用,因为var fixture = new Fixture(); fixture.Customize<TBase>(c => c.Create<TDerived>()); var model = this.fixture.Create<TopLevel>(); 中的lambda表达式是错误的。我猜这是一种方法,但AutoFixture似乎缺乏文档,而不是开发人员博客的意识流。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:9)

虽然dcastro的答案也是一个选项,但最安全的选择是使用TypeRelay类。

fixture.Customizations.Add(
    new TypeRelay(
        typeof(TBase),
        typeof(TDerived));

答案 1 :(得分:7)

使用Register方法告诉AutoFixture如何创建特定类型的实例。

fixture.Register<TBase>(() => new TDerived());

或者,正如@sgnsajgon所指出的那样:

fixture.Register<TBase>( fixture.Create<TDerived> );