Я начал строить строитель, чтобы я мог легко создавать тестовые данные для модульных тестов, которые я пишу.Как создать построитель в C# для объекта, который имеет свойства, которые являются ссылочными типами?
Основная структура строитель:
public class MyClassBuilder
{
public int id = 0; //setting the default value here
//allows MyClass to be built with a specific id
public MyClassBuilder WithId(int id)
{
this.id = id;
return this;
}
public MyClass Build()
{
return new MyClass(id);
}
}
Использование этой модели становится:
MyClass mc = new MyClassBuilder().WithId(5).Build();
мне комфортно с этим ... но где у меня есть вопросы, когда MyClass
имеет свойство, которое не является тривиальным. Я немного сомневаюсь в том, как построить его со значением по умолчанию.
public class MyClassBuilder
{
public int id = 0; //setting the default value here
//do I construct the default value using a MySecondClassBuilder?
public MySecondClass mySecondClass;
//allows MyClass to be built with a specific id
public MyClassBuilder WithId(int id)
{
this.id = id;
return this;
}
public MyClassBuilder WithMySecondClass(MySecondClass mySecondClass)
{
this.mySecondClass = mySecondClass;
}
public MyClass Build()
{
return new MyClass(id);
}
}
Мое предположение, что я хотел бы создать конструктор для MySecondClass
и использовать, чтобы создать реализацию по умолчанию.
Может ли кто-нибудь подтвердить, что мое предположение верно и является наилучшей практикой?
В настоящее время я тестирую свое предположение, но я думал, что буду документировать эту идею в StackOverflow с единственными примерами шаблона компоновщика, который мог бы найти с использованием только когда-либо построенных свойств Google, которые являются типами значений и а не ссылочные типы.
Все, что я хочу использовать для этих сборщиков, это создание объектов для использования в моих модульных тестах, чтобы я мог знать, что они полностью сконструированы и не будут генерировать ненужные ссылочные исключения при использовании частями кода I Не тестировать. Это немного разъясняет? – mezoid
Не совсем. Это одна из основных причин использования традиционных конструкторов с перегрузками - обычный стандартный конструктор ВСЕГДА оставит объект в работоспособном состоянии (при условии, что класс хорошо разработан), поскольку такие строители могут вызвать всевозможные проблемы. Если ваши классы таковы, ваши модульные тесты могут просто построить их, используя стандартные конструкторы. Как это проще, чем стандартный конструктор (плюс дополнительный инициализатор объекта)? http://msdn.microsoft.com/en-us/library/bb384062.aspx –
Ну, класс, который я пытаюсь построить, представляет собой класс, который автоматически генерируется для использования NHibernate для представления одной из таблиц в базе данных , Он имеет более 30 параметров для конструктора, который делает конструкцию объектов для использования в модульных тестах очень утомительной ... тем более, что мне приходится вручную создавать многие параметры, которые мне действительно не нужны. – mezoid