Как сгенерировать объект-заглушку произвольного типа, неизвестного во время компиляции, с помощью AutoFixture

Я могу получить тип параметра конструктора следующим образом:

Type type = paramInfo.ParameterType;

Теперь я хочу создать объект-заглушку из этого типа. Возможно ли? Я пробовал с автофиксацией:

public TObject Stub<TObject>()
{
   Fixture fixture = new Fixture();   
   return fixture.Create<TObject>();
}

.. но это не работает:

Type type = parameterInfo.ParameterType;   
var obj = Stub<type>();//Compile error! ("cannot resolve symbol type")

Вы не могли бы мне помочь?


person user2598794    schedule 23.09.2013    source источник
comment
Есть ли у autofixture неуниверсальный API? Переключение между отражением (Type) и дженериками (<T>)... немного болезненно (и медленно) - вы можете сделать это (с еще большим отражением) - но этого лучше избегать, если это вообще возможно. ..   -  person Marc Gravell    schedule 23.09.2013
comment
Похоже, AutoFixture не предлагает простого решения этой проблемы: thomasardal.com/   -  person meilke    schedule 23.09.2013
comment
Можно ли вообще создать заглушку с Type? (с автофиксацией или без)   -  person user2598794    schedule 23.09.2013
comment
Конечно, в основном с Reflection. NSubsitute также имеет меры для этого: nsubstitute.github.io/help/creating-a -заменить   -  person meilke    schedule 23.09.2013
comment
Ответ, предоставленный Энрико Кампидольо, правильный, но почему вы вообще хотите это сделать? Похоже, вы пытаетесь автоматизировать использование AutoFixture (и это нормально), но, вероятно, есть лучшие, более идиоматические способы сделать это...   -  person Mark Seemann    schedule 23.09.2013
comment
@Mark Seemann Моя цель была следующей: каждый из моих классов обслуживания имеет некоторые зависимости (введенные через конструктор). Каждый метод в этом классе обслуживания использует только некоторые из этих зависимостей. Итак, в модульном тесте, когда я тестирую какой-либо метод, я не хочу каждый раз создавать тестовый класс со всеми зависимостями, но я хочу заменить зависимости, которые не используются в тестируемом методе, заглушками. Моей целью было автоматизировать создание сервисов, и я поместил это создание в отдельный базовый модульный тест. Я был бы признателен, если бы вы предложили мне лучшие способы)   -  person user2598794    schedule 23.09.2013
comment
Вы можете легко превратить AutoFixture в Auto-mocking Container. См., например. этот ответ для обзора: stackoverflow.com/a/12871065/126014   -  person Mark Seemann    schedule 23.09.2013


Ответы (1)


AutoFixture имеет нестандартный API для создания объектов, хотя и скрытый (по дизайн):

var fixture = new Fixture();
var obj = new SpecimenContext(fixture).Resolve(type);

Как указано в сообщении в блоге, на которое ссылается @meilke, если вы обнаружите, вам часто это нужно, вы можете инкапсулировать его в методе расширения:

public object Create(this ISpecimenBuilder builder, Type type)
{
    return new SpecimenContext(builder).Resolve(type);
}

который позволяет вам просто делать:

var obj = fixture.Create(type);
person Enrico Campidoglio    schedule 23.09.2013