2014-10-07 2 views
1

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

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

+1

Вот РоС: http://blog.ploeh.dk/2010/11/22/IntegratingAutoFixturewithObjectHydrator –

+0

Это было очень интересно и полезно, Спасибо. К сожалению, по крайней мере, поскольку он настроен в сообщении в блоге, он, похоже, не знает, что делать с элементами, которые входят в конструктор. Я буду продолжать искать способы настройки для каждого класса и, надеюсь, ObjectHydrator для генерации данных. – Riplikash

+0

В сообщении в блоге он нацелен на объекты 'PropertyInfo'. Попробуйте вместо таргетинга объекты ParameterInfo, и вам должно быть хорошо идти. –

ответ

0

Хорошо, решена моя проблема.

Генерация объектов для данного типа класса может быть выполнена с помощью метода 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()); 
    } 

}