В нашем последнем проекте мы получили общий тестовый прибор для наших модульных тестов, который дал много проблем. Итак, в нашем текущем проекте я изучил шаблон сборки. Мы запускаем наши модульные тесты в памяти на компьютерах разработчиков и на базе данных на сервере сборки.
В настоящее время у меня есть шаблон T4, который производит, например, следующий компоновщик для ученика:
public class StudentBuilder : Builder<Student, StudentBuilder>
{
public StudentBuilder()
{
IsMale = true;
}
public StudentBuilder WithFirstName(string firstName)
{
this.FirstName = firstName;
return this;
}
public StudentBuilder WithLastName(string lastName)
{
this.LastName = lastName;
return this;
}
public StudentBuilder WithIsMale(bool isMale)
{
this.IsMale = isMale;
return this;
}
internal override Student Construct()
{
Student result = new Student()
{
FirstName = FirstName ?? "FirstName:" + id.ToString(),
LastName = LastName ?? "LastName:" + id.ToString(),
IsMale = IsMale,
Id = id,
};
/ return result;
}
}
Через базовые классы я могу использовать это следующим образом:
Student wouter = StudentBuilder.Build()
.WithFirstName("Wouter")
.WithLastName("de Kort");
List<Student> students = StudentBuilder.Build().Multiple(10, (builder, index) => builder.WithFirstName("FirstName" + index));
Мы запускаем интеграционные тесты на нашем сервере сборки, чтобы убедиться, что все работает с базой данных. Это означает, что мы должны убедиться, что все ссылочные ограничения выполнены.
Но тогда начинаются проблемы.
Например, у ученика должен быть наставник, наставник принадлежит школе, школа - городу, город - ....
Это приведет к коду:
StudentBuilder.Build().WithMentor(MentorBuilder.Build().WithSchool(SchoolBuilder.Build().WithCity(CityBuilder.Build()))
Как мне это оптимизировать? Я думал о создании «здания по умолчанию» в методе «Построение» каждого строителя, но если бы я собрал 10 учеников, это привело бы к 10 наставникам в 10 школах в 10 городах в 10 ....
Или, возможно, создание методов, таких как WithAllCity (..), WithAll (School)
Есть идеи? Я на самом деле использую шаблон Builder правильно? Может ли помочь директорский класс? Или я должен был унаследовать классы от StudentBuilder, которые решают эти разные случаи?
Или еще одна идея, должен ли я добавить дополнительную проверку в свой уровень обслуживания перед отправкой данных в базу данных? Тогда я поймал бы больше ошибок в моих модульных тестах против базы данных в памяти.