AutoFixture & AutoMoq: переопределение поведения генерации объекта

Я предлагаю использовать AutoFixture и AutoFixture.xUnit в нашей компании и получил мандат на то, что для определенных объектов и полей им нужны случайные данные, отформатированные ожидаемым образом. Например, они хотят, чтобы PersonName заполнялось только реалистичными именами (вместо GUID), а PhoneNumber - только строками, которые выглядят как телефонные номера. Но они не хотят добавлять аннотации данных к фактическим объектам, обеспечивающим это, они просто хотели бы, чтобы тестовые данные, сгенерированные AutoFixture, были красивыми.

Я немного разбирался с классами ICustomize для реализации жадного поведения конструктора в нескольких классах. Есть ли подобный способ переопределить генерацию данных для конкретных объектов? (Например) извлечь имена из списка или сгенерировать данные, чтобы следовать определенному регулярному выражению? (имея в виду, что я не могу добавить эти регулярные выражения в качестве атрибутов в модель)

1 ответ

Решение

Ок, решил мою проблему.

Создание объекта для данного типа класса может быть выполнено с помощью метода Fixture.Register. Вы можете создать метод, который возвращает тип, который вы хотите переопределить, и который будет использоваться вместо значения по умолчанию.

Чтобы получить значимые данные, я просто использовал Faker.Net.

Я получил решение, на которое указал Марк, работающее, и оно мне действительно понравилось для обычных POJO, но в моем случае многие из моих объектов имели свойства, которые можно было установить только через конструктор или агрегатные сеттеры (например, ChangeContactInfo), поэтому, к сожалению, мне нужно что-то немного более целенаправленный. Вот пример моего решения, реализующего переопределение генерации имени и адреса:

public class CustomObjectGeneration : ICustomization
{
    public void Customize(IFixture fixture)
    {
        fixture.Register(GenerateAddress); 
        fixture.Register(GeneratePersonName);
    }

    private Address GenerateAddress()
    {
        return new Address(Faker.Address.StreetAddress(), Faker.Address.SecondaryAddress(), Faker.Address.City(),
            Faker.Address.ZipCode(), Faker.Address.UsState(), Faker.Address.Country());
    }

    private PersonName GeneratePersonName()
    {

        return new PersonName(Faker.Name.Prefix(), Faker.Name.First(), Faker.Name.First(), Faker.Name.Last(), Faker.Name.Suffix());
    }

}
Другие вопросы по тегам