nBuilder только заполняет типы значений
Я использую nBuilder для заполнения графа объектов, но он только заполняет типы значений. Я хочу, чтобы он заполнял ссылочные типы (связанные объекты).
2 ответа
В настоящее время NBuilder не поддерживает автоматическое заполнение ссылочных типов.
Тем не менее, можно сделать то, что вы хотите, используя конструктор для создания каждого ссылочного типа.
На данный момент вы, вероятно, делаете это:
var person = Builder<Person>
.CreateNew()
.Build();
Assert.That(person.Name, Is.EqualTo("Name1"));
Assert.That(person.Address, Is.Null);
То, что вы хотите сделать, это:
var address = Builder<Address>
.CreateNew()
.Build();
var person2 = Builder<Person>
.CreateNew()
.With(x => x.Address = address)
.Build();
Assert.That(person2.Name, Is.EqualTo("Name1"));
Assert.That(person2.Address, Is.Not.Null);
Assert.That(person2.Address.Street, Is.EqualTo("Street1"));
Assert.That(person2.Address.Zipcode, Is.EqualTo("Zipcode1"));
Это невозможно в NBuilder.
Но есть и ручной инструмент. Эта статья содержит фрагмент кода, который рекурсивно вызывает NBuilder для создания объектов, которые заполняют свойства ссылки и коллекции корневого объекта (до заданной глубины):
var recursiveObjectBuilder = new RecursiveObjectBuilder(graphDepth: 2, listSize: 3);
var complexObject = recursiveObjectBuilder.CreateGenericObject<ComplexType>(recursive:true);
Assert.NotNull(complexObject.ReferenceToOtherObject);
int someValue = complexObject.ReferenceToOtherObject.SomeValue;
Ограничение, которое я обнаружил в NBuilder, заключается в том, что данные, которые он генерирует для строк таким образом, состоят в том, что он основан на именах свойств, например Name1, Street1, Zipcode1, как вы видите выше. Я обнаружил, что использую.Phrase(), но он не генерирует разумных случайных данных, и такие элементы, как электронные письма, должны быть соединены вместе.
Вы можете скачать Faker.Net по ссылке nuget здесь или использовать Visual Studio, чтобы он создавал фиктивные данные как часть вашей команды сборки. Затем вы можете использовать его для создания макетов объектов Person (снова используя Faker/NBuilder).
var addresses = Builder<Address>.CreateListOfSize(20)
.All()
.With(c => c.Street = Faker.StreetName().First())
.With(c => c.State = Faker.UsState().First())
.With(c => c.ZipCode = Faker.ZipCode().First())
.Build();
Этот блог подробно описывает еще несколько примеров.