Как я могу заполнить экземпляр объекта случайными значениями?

Есть ли способ дать AutoFixture экземпляр объекта, пройти через все сеттеры и установить случайные данные? Вики-примеры показывают только, как получить экземпляр из AutoFixture, например.

var autoGeneratedClass = fixture.Create<ComplexParent>();

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

dynamic dynamicPropertyObject1 = factoryMethod(configuration);
dynamic dynamicPropertyObject2 = factoryMethod(configuration);
dynamicPropertyObject1.propA = random.Next();
dynamicPropertyObject1.CopyTo(dynamicPropertyObject2); 
Assert.That(dynamicPropertyObject2.propA, Is.EqualTo(dynamicPropertyObject1.propA);

Спасибо


person Andrew Corcoran    schedule 27.02.2015    source источник
comment
Вы пробовали что-нибудь? Что это было? Что он сделал не так? Можете ли вы генерировать случайные данные? Можете ли вы провести интроспекцию экземпляра? Требуется более подробная информация...   -  person Wain    schedule 27.02.2015
comment
Зачем тебе это нужно?   -  person Mark Seemann    schedule 01.03.2015
comment
У нас есть чрезвычайно сложный фабричный метод, который срабатывает и создает объект с вложенными взаимодействующими типами под ним. Чтобы еще больше усложнить ситуацию, некоторые типы создаются динамически в фабричном методе, поскольку они могут иметь динамические свойства, определяемые динамически путем передачи конфигурации. Чтобы полностью протестировать эти типы, мне нужно использовать динамически созданные объекты, сгенерированные фабричным методом.   -  person Andrew Corcoran    schedule 02.03.2015
comment
@MarkSeemann Есть новости по этому поводу?   -  person Andrew Corcoran    schedule 16.06.2015
comment
@AndrewCorcoran Обновления о чем? Поскольку у вас есть фабричные методы, почему бы вам просто не вызвать их?   -  person Mark Seemann    schedule 16.06.2015
comment
Наш фабричный метод создает новый тип с помощью IL и возвращает его экземпляр. Мы хотим заполнить этот экземпляр случайными данными, а не значениями по умолчанию в С#.   -  person Andrew Corcoran    schedule 19.06.2015


Ответы (1)


AutoFixture имеет множество встроенных эвристик для создания объектов, в том числе некоторые для фабричных методов.

Если AutoFixture не находит общедоступных конструкторов для типа, он начинает искать фабричные методы; то есть статические методы, которые возвращают объекты типа класса, который определяет этот статический метод, например.

public class Foo
{
    public static Foo CreateFoo();

    // ... other members
}

Если, с другой стороны, фабричный метод существует в другом классе, вам нужно будет немного помочь AutoFixture. Проще всего было бы использовать метод Customize:

fixture.Customize<Foo>(c => c
    .FromFactory(() => FooFactory.CreateFoo())
    .WithAutoProperties());

Когда вы впоследствии запросите объект Fixture для объекта Foo, будет вызван FooFactory.CreateFoo(), и из-за WithAutoProperties этот объект будет заполнен данными, созданными AutoFixture.

person Mark Seemann    schedule 29.11.2015