Я пытаюсь создать объект с помощью 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
Как избежать использования глобальной настройки в AutoFixture ⇐ C#
Место общения программистов C#
-
Anonymous
1728228448
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());
Подробнее здесь: [url]https://stackoverflow.com/questions/79057910/how-to-avoid-using-global-customization-in-autofixture[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия