AutoFixture: как установить (вложенные) свойства вручную на основе шаблона - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть следующие вложенные классы, которые приходят из файлов XSD, сгенерированных с помощью xsd.exe.

public class MyClass
{
    public AnotherClass[] PropertyOne; 

    public DateTime PropertyTwo; 

    public bool PropertyTwoSpecified
}

public class AnotherClass
{
    public DateTime AnotherPropertyOne

    public bool AnotherPropertyOneSpecified

    public int AnotherPropertyTwo

    public bool AnotherPropertyTwoSpecified
}

Теперь я хотел бы использовать AutoFixture для генерации экземпляров с синтетическими данными.

var fixture = new Fixture(); 
fixture.Customize(new AutoFakeItEasyCustomization());

var myClassFake = fixture.Create<MyClass>();

Я знаю, что могу использовать .with для установки отдельных свойств, но как я могу установить свойства на основе определенного шаблона?Особенно, когда эти свойства вложены в массивы?

В основном я должен убедиться, что все свойства, заканчивающиеся на *Specified, установлены на true.Включая один раз вложенный в PropertyOne

Должен ли я использовать мой метод, основанный на одном отражении, например, метод расширения (например, myClassFake.EnableAllProperties()), или есть ли способ AutoFixture для достижения моей цели?


Редактировать

Я знаю, что могу использовать fixture.Register<bool>(() => true);, чтобы установить все мои bool на true.Это решает мою очень специфическую проблему, но все еще кажется неуклюжим и неприменимым.Все еще ищу точный способ решить эту проблему.

1 Ответ

0 голосов
/ 31 декабря 2018

В итоге я создал две реализации ISpecimenBuilder, которые идеально подходят для моей ситуации.

Этот параметр устанавливает все логические свойства, заканчивающиеся на * Указано значение true, не затрагивая другие логические свойства.

public class SpecifiedBoolSpecimenBuilder : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {
        var pi = request as PropertyInfo;

        if (pi == null)
        {
            return new NoSpecimen();
        }

        if (pi.PropertyType != typeof(bool) || !pi.Name.EndsWith("Specified"))
        {
            return new NoSpecimen();
        }

        return true;
    }
}

Этот параметр устанавливает определенное свойство в диапазон случайных значений:

public class OidSpecimenBuilder : ISpecimenBuilder
{
    public int Min { get; set; }

    public int Max { get; set; }

    public OidSpecimenBuilder(int min, int max)
    {
        this.Min = min;
        this.Max = max; 
    }

    public object Create(object request, ISpecimenContext context)
    {
        var pi = request as PropertyInfo;

        if (pi == null)
        {
            return new NoSpecimen();
        }

        if (pi.PropertyType != typeof(long) || pi.Name != "OID")
        {
            return new NoSpecimen();
        }

        return context.Resolve(new RangedNumberRequest(typeof(long), Min, Max));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...