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

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

2 ответа

Решение

Хотя ответ от 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> );
Другие вопросы по тегам