В нашем последнем проекте мы закончили с общей тестовой установкой для наших модульных тестов, что дало много проблем. Итак, в нашем текущем проекте я изучил шаблон построителя. Мы запускаем наши модульные тесты в памяти на машинах разработки и в базе данных на сервере сборки.
В настоящее время у меня есть шаблон 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()))
Как мне это оптимизировать? Я думал о том, чтобы сделать «здание по умолчанию» в методе Construct каждого Строителя, но если бы я построил 10 учеников, это привело бы к 10 наставникам в 10 школах в 10 городах из 10 ....
Или, может быть, создание таких методов, как WithAllCity (..), WithAll (School)
Любые идеи? Правильно ли я использую шаблон Builder? Может ли помочь класс директора? Или мне следовало унаследовать классы от StudentBuilder, которые решают эти разные случаи?
Или еще одна идея: следует ли мне добавить дополнительную проверку на уровень обслуживания перед отправкой данных в базу данных? Тогда я бы обнаружил больше ошибок в своих модульных тестах по базе данных в памяти.
We run our unit tests in memory on the development machines and against the database on the build server.
- Это звучит болезненно для устранения неполадок. Как это работает для вашего проекта? - person Ritch Melton   schedule 09.11.2011