Учитывая, что у меня есть класс в одной сборке под названием GBase с конструктором, который принимает 2 параметра, и подкласс GBase (назовем его GDerived), который принимает те же параметры, как мне разделить их, чтобы я мог модульно протестировать подкласс?
В другой сборке:
public class GBase
{
public GBase(ParamType1 param1, ParamType2 param2)
{
...
}
protected ParamType1 SomeProperty { get; set; }
// other stuff
}
В этой сборке:
public class GDerived : GBase
{
public GDerived(ParamType1 param1, ParamType2 param2)
:base(param1, param2)
{
// new code
SomeProperty = newCalculatedValue;
// other stuff
}
// other stuff
}
Исходный класс GBase является унаследованным кодом, как и общая структура программы — об изменении структуры не может быть и речи из-за размера кодовой базы (плюс 10 тыс. строк) — ни для одного из которых никогда не был написан модульный тест до совсем недавно.
Итак, теперь я хочу написать тест (используя NUnit) для конструктора подкласса, чтобы убедиться, что правильные свойства заполнены правильными значениями. Обратите внимание, что тестовые классы находятся в том же проекте, что и тестируемые классы.
[TestFixture]
public class GDerivedTests
{
[Test]
public void GDerivedConstructor_ValidParams_PropertiesSetCorrectly()
{
var newGDerived = new GDerived(parameter1, parameter2);
Assert.That(SomeProperty == parameter1;
}
}
Это очень грубое представление того, с чем нам приходится иметь дело, и есть случаи, отличные от установки свойства в базовом классе, которые нам нужно протестировать. Я просто даже не знаю точно, с чего начать. У меня есть книга Майкла Фезерса «Эффективная работа с устаревшим кодом», но она, похоже, не охватывает этот распространенный «шаблон проектирования», который широко используется во всем коде, с которым мы имеем дело. Это потому, что это так просто, что любой моргающий иджйот должен знать, как с этим справиться, или это потому, что это редкий случай? Я почему-то так не думаю, но могу ошибаться...
Один из возможных методов, о котором я подумал, - это извлечь интерфейс для базового класса и смоделировать конструктор базового класса, но я не уверен в деталях, как это сделать. Обратите внимание, что мы все относительные новички в модульном тестировании в команде, у нас нет опыта. Не новички в программировании, а только новички в модульном тестировании.
Тиа, Дэйв