`
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) `
публичный класс 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
Мобильная версия