Как я могу сказать 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> );