Как избежать использования глобальной настройки в AutoFixtureC#

Место общения программистов C#
Ответить
Anonymous
 Как избежать использования глобальной настройки в AutoFixture

Сообщение Anonymous »

Я пытаюсь создать объект с помощью ISpecimenBuilder:
`
var fixture= new Fixture();
fixture.Customizations. Add(new SkipNonPrimitiveMembersCustomization());
var person= fixment.Create(); // работает как положено
var node = fixment.Create(); // устанавливаются только свойства примитивного типа
`
Это не то, что я хочу для объекта узла. Поэтому я связал с помощью метода FromFactory:

Код: Выделить всё

 var fixture= new Fixture(); var node = fixture.Build() .FromFactory(new SkipNonPrimitiveMembersCustomization()) .Create();
и я получил:
`
Сообщение: 
AutoFixture.ObjectCreationException: оформленный ISpecimenBuilder не смог создать образец на основе запроса : SkipNonPrimitiveMembersCustomizationTests+Node. Это может произойти, если запрос представляет интерфейс или абстрактный класс; в этом случае зарегистрируйте ISpecimenBuilder, который может создавать образцы на основе запроса. Если это происходит в строго типизированном выражении сборки, попробуйте указать фабрику с помощью одного из методов IFactoryComposer.
Stack Trace: 
NoSpecimenOutputGuard.Create(Запрос объекта, контекст ISpecimenContext)Postprocessor1.Create(запрос объекта, контекст ISpecimenContext)
CompositeSpecimenBuilder.Create(запрос объекта, контекст ISpecimenContext)
FilteringSpecimenBuilder.Create (запрос объекта, контекст ISpecimenContext)
NodeComposer1.Create(Object запрос, контекст ISpecimenContext)
CompositeSpecimenBuilder.Create (запрос объекта, контекст ISpecimenContext)
RecursionGuard.Create (запрос объекта, контекст ISpecimenContext)
CompositeNodeComposer1.Create (запрос объекта, контекст ISpecimenContext)
SpecimenContext.Resolve(запрос объекта)
SeedIgnoringRelay.Create(запрос объекта, контекст ISpecimenContext)
CompositeSpecimenBuilder.Create (запрос объекта, контекст ISpecimenContext)
FilteringSpecimenBuilder.Create (запрос объекта, контекст ISpecimenContext)
NodeComposer

Код: Выделить всё

1.Create(Object request, ISpecimenContext context) CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) RecursionGuard.Create(Object request, ISpecimenContext context) CompositeNodeComposer1.Create(Object request, ISpecimenContext context) SpecimenContext.Resolve(Object request) SpecimenFactory.Create[T](ISpecimenContext context) SpecimenFactory.Create[T](ISpecimenBuilder builder) SpecimenFactory.Create[T](IPostprocessComposer1 composer) 
Мой SpecimenBuilder:
`
публичный класс SkipNonPrimitiveMembersCustomization: ISpecimenBuilder
{
публичный объект Create (запрос объекта, контекст ISpecimenContext )
{
if (запрос — PropertyInfo propInfo && propInfo != null && !IsPrimitiveType(propInfo.PropertyType))
return new OmitSpecimen();

Код: Выделить всё

    return new NoSpecimen();
}

private static bool IsPrimitiveType(Type type)
{
if (type is null) return false;

return type.IsPrimitive ||
type.IsValueType ||
type == typeof(string) ||
// handle arrays of primitive types
type.IsArray && IsPrimitiveType(type.GetElementType()) == true ||
type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable) && type.GenericTypeArguments.All(IsPrimitiveType) ||
// type is a generic type with value type arguments that are all also primitive types
type.GetGenericArguments().Any(t => t.IsValueType && IsPrimitiveType(t));
}
}
узел частного класса
{
public string Name { get; набор; public int Id { get; набор; }
public string[] Теги { get; набор; публичный TestEnum? TestEnum {получить; набор; публичный DateTime? CreatedAt {получить; набор; public Node[] Children { get; набор;
Кстати, я знаю, что мне нужно избегать циклических ссылок в конце:

Код: Выделить всё

fixture.Behaviors.OfType().ToList() .ForEach(b => _fixture.Behaviors.Remove(b)); fixture.Behaviors.Add(new OmitOnRecursionBehavior());


Подробнее здесь: https://stackoverflow.com/questions/790 ... utofixture
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»