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

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

Сообщение Anonymous »

Я пытаюсь создать объект с помощью ISpecimenBuilder:
var fixture= new Fixture();
fixture.Customizations.Add(new SkipNonPrimitiveMembersCustomization());

var person= fixture.Create
(); // works as expected
var node = fixture.Create(); // only primitive type properties are set

Это не то, что мне нужно для объекта узла. Поэтому я связал с помощью метода FromFactory:
var fixture = new Fixture();
var node = fixture.Build()
.FromFactory(new SkipNonPrimitiveMembersCustomization())
.Create();

и я получил:

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

NoSpecimenOutputGuard.Create(Object request, Контекст ISpecimenContext)

Postprocessor1.Create(запрос объекта, контекст ISpecimenContext)
CompositeSpecimenBuilder.Create (запрос объекта, контекст ISpecimenContext)

FilteringSpecimenBuilder.Create(запрос объекта, Контекст ISpecimenContext)

NodeComposer1.Create (запрос объекта, контекст ISpecimenContext)
CompositeSpecimenBuilder.Create (запрос объекта, контекст ISpecimenContext)

RecursionGuard.Create (запрос объекта, Контекст ISpecimenContext)
CompositeNodeComposer1.Create(запрос объекта, контекст ISpecimenContext)

SpecimenContext.Resolve (запрос объекта)
SeedIgnoringRelay.Create (запрос объекта, контекст ISpecimenContext)
CompositeSpecimenBuilder.Create(запрос объекта, контекст ISpecimenContext)

FilteringSpecimenBuilder.Create (запрос объекта, контекст ISpecimenContext)

NodeComposer`1.Create (запрос объекта, контекст ISpecimenContext)
CompositeSpecimenBuilder.Create(запрос объекта, контекст ISpecimenContext)
RecursionGuard.Create(запрос объекта, контекст ISpecimenContext)

CompositeNodeComposer1.Create (запрос объекта, контекст ISpecimenContext)

SpecimenContext.Resolve(запрос объекта)

SpecimenFactory.Create[T](контекст ISpecimenContext)

SpecimenFactory.Create[T](построитель ISpecimenBuilder)
SpecimenFactory.Create[T](композитор IPostprocessComposer1)

Мой SpecimenBuilder:
public class SkipNonPrimitiveMembersCustomization : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
if (request is 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));
}
}

private class Node
{
public string Name { get; set; }
public int Id { get; set; }
public string[] Tags { get; set; }
public TestEnum? TestEnum { get; set; }
public DateTime? CreatedAt { get; set; }
public Node[] Children { get; set; }
}

Кстати, я знаю, что мне нужно избегать циклических ссылок в конце:
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#»