Как я могу сказать, что AutoFixture всегда создает TDerived, когда он создает экземпляр TBase?

У меня есть глубоко вложенная объектная модель, где некоторые классы могут выглядеть примерно так:

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 неверно. Я предполагаю, что есть способ сделать это, но у AutoFixture нет документации, кроме как потока сознания в блоге разработчика.

Может ли кто-нибудь указать мне в правильном направлении?

Ответ 1

В то время как ответ dcastro также является опцией, самым безопасным вариантом является использование класса TypeRelay.

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

Ответ 2

Используйте метод Register, чтобы сообщить AutoFixture, как создавать экземпляры определенного типа.

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

или, как указано @sgnsajgon:

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