Необходимо реализовать генератор объектов со случайными тестовыми данными:
var faker = new Faker();
Foo foo = faker.Create<Foo>();
Bar bar = faker.Create<Bar>();
int i = faker.Create<int>();
// Далее в примерах List носит иллюстративный характер.
// Вместо него может быть выбрана любая коллекция из условия.
List<Foo> foos = faker.Create<List<Foo>>();
List<List<Foo>> lists = faker.Create<List<List<Foo>>>();
List<int> ints = faker.Create<List<int>>();
При создании объекта следует использовать конструктор, а также заполнять публичные поля и свойства с публичными сеттерами, которые не были заполнены в конструкторе. Следует учитывать сценарии, когда у класса только приватный конструктор, несколько конструкторов, конструктор с параметрами и публичные поля/свойства.
При наличии нескольких конструкторов следует отдавать предпочтение конструктору с большим числом параметров, однако если при попытке его использования возникло исключение, следует пытаться использовать остальные.
Обратите внимание, что у пользовательских типов-значений (value types),
которыми являются структуры, объявляемые ключевым словом struct
,
всегда есть конструктор без параметров, однако в дополнение к нему может быть
объявлен и пользовательский конструктор (который следует пытаться использовать первым,
руководствуясь логикой предпочтения конструктора с большим числом параметров).
Заполнение должно быть рекурсивным (если полем является другой объект,
то он также должен быть создан с помощью Faker
).
Реализовать генераторы случайных значений для базовых типов-значений
(int
, long
, double
, float
, etc), строк, одного любого системного класса
для представления определенного типа данных на выбор (дата/время, url, etc),
коллекций объектов всех типов, которые могут быть сгенерированы Faker
(поддержка разновидностей IEnumerable<T>
, List<T>
, IList<T>
, ICollection<T>
,
T[]
на усмотрение автора, минимум один вариант из приведенных).
Создание коллекций должно выполняться аналогично созданию других типов, для которых есть генераторы. Внутри кода Faker не должно быть проверок if/switch на коллекцию и какой-то особой обработки. Один из вариантов интерфейса IGenerator для такой обработки есть в FAQ. Допустим и любой другой способ, согласующийся с требованием об отсутствии специальных проверок для коллекций.
Выделить как минимум 2 предопределенных генератора в отдельные подключаемые модули (плагины), которые будут загружаться на старте приложения.
Предусмотреть учет циклических зависимостей:
class A
{
public B { get; set; }
}
class B
{
public C { get; set; }
}
class C
{
public A { get; set; } // циклическая зависимость,
// может быть на любом уровне вложенности
}