AutoFixture + AutoMoq: создание макета с исключенным свойством

Например, ISomething — это интерфейс с тремя свойствами: string Name и int Count и некоторым сложным свойством ImComplex (с циклическими зависимостями и т. д.), которые я не хочу создавать с помощью AutoFixture. Поэтому мне нужно, чтобы AutoFixture создал макет ISomething с Name и Count, настроенными по его алгоритму по умолчанию, и ImComplex как null. Но если я попытаюсь решить это так, я получаю исключение:

fixture.Customize(new AutoConfiguredMoqCustomization());
var some = fixture.Build<ISomething>().Without(x=>x.ImComplex).Create<ISomething>();

Ploeh.AutoFixture.ObjectCreationException : декорированный ISpecimenBuilder не смог создать образец на основе запроса: RP.Core.IInformationUnit. Это может произойти, если запрос представляет интерфейс или абстрактный класс; в этом случае зарегистрируйте ISpecimenBuilder, который может создавать образцы на основе запроса. Если это происходит в строго типизированном выражении сборки, попробуйте указать фабрику с помощью одного из методов IFactoryComposer.

Что я должен делать?


person AsValeO    schedule 28.11.2015    source источник


Ответы (1)


Build отключает все настройки (как указано в документации метода), поэтому он не будет работать вместе с AutoConfiguredMoqCustomization.

Если проблема в том, что свойство имеет циклическую зависимость, вы можете:

  1. пересмотрите свой дизайн (причина, по которой AutoFixture по умолчанию выбрасывает, когда находит циклическую зависимость, потому что это обычно запахи дизайна)
  2. настроить AutoFixture, чтобы разрешить циклические зависимости до определенной глубины

    fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList()
        .ForEach(b => fixture.Behaviors.Remove(b));
    
    int recursionDepth = 2;
    fixture.Behaviors.Add(new OmitOnRecursionBehavior(recursionDepth));
    
person dcastro    schedule 28.11.2015
comment
Спасибо! Сущности Entity Framework имеют свойства навигации, которые вызывают циклические зависимости. Я пытался использовать OmitOnRecursionBehavior, но безуспешно. - person AsValeO; 29.11.2015