AutoFixture: как правильно использовать BooleanSwitch () из реализации ISpecimenBuilder для генерации случайных значений? - PullRequest
0 голосов
/ 16 января 2019

У меня есть класс, который полностью состоит из строковых типов ... Я не доволен этим, но не могу изменить его. Этот класс является представлением некоторых CSV, которые анализируются.

Теперь я хотел бы создать поддельные экземпляры. Например, я хотел бы сгенерировать случайные логические значения и преобразовать их в строку. Для этого я создал реализацию ISpecimenBuilder, которая работает до сих пор.

public class MyPropertyBuilder : ISpecimenBuilder
{
    private readonly Random rand;

    public MyPropertyBuilder()
    {
        this.rand = new Random();
    }
    public object Create(object request, ISpecimenContext context)
    {
        var pi = request as PropertyInfo;

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

        if (pi.PropertyType == typeof(string) && pi.Name == "MyPropertyName")
        {
            return (this.rand.NextDouble() > 0.5).ToString();
        }

        return new NoSpecimen();
    }
}

Но я как-то не понимаю, как правильно использовать context.Resolve() и классы *Request, такие как RangedNumberRequest(), как в следующем фрагменте кода.

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

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

        if (pi.PropertyType == typeof(string) && pi.Name == "ORDER_NR")
        {
            return context.Resolve(new RangedNumberRequest(typeof(int), 0, int.MaxValue)).ToString();
        }

        return new NoSpecimen();
    }
}

Конечно, я могу реализовать свой собственный способ генерации случайного логического значения и заставить MyPropertyBuilder возвращать это, но разве это не противоречит цели AutoFixture, когда я каким-то образом заново изобретаю часть генерации данных для некоторых типов примитивов?

Итак, я предполагаю, что вопрос заключается в следующем: как правильно использовать генератор логических значений AutoFixtures для определенного свойства?

1 Ответ

0 голосов
/ 11 февраля 2019

Если я правильно понимаю, все свойства класса имеют тип string, но представляют другие типы данных (логические, целые или даты).

Мое предложение было бы создать класс FixtureBuilder с типами свойств, которые вы ожидаете. С Autfixture вы сможете генерировать случайные значения, а затем преобразовать его в представление CSV.

public class CsvData
{
    public string Enabled { get; set; }
    public string Quantity { get; set; }
    public string Price { get; set; }
}

public class CsvDataBuilder
{
    public bool Enabled { get; set; }
    public int Quantity { get; set; }
    public decimal Price { get; set; } 

    public CsvData ToCsvData()
    {
        return new CsvData
        {
            Enabled = Enabled.ToString(),
            Quantity = Quantity.ToString(),
            Price = Price.ToString()
        };
    }
}

Затем в тестах вы можете создать конструктор в

var dataFromCsv = new Fixture().Create<CsvDataBuilder>().ToCsvData();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...