Якщо у мене в коді функція така:
class Employee{
public string calculateTax(string name, int salary)
{
switch (name)
{
case "Chris":
doSomething($salary);
case "David":
doSomethingDifferent($salary);
case "Scott":
doOtherThing($salary);
}
}
Зазвичай я б перетворював це на використання Ploymorphism, використовуючи заводський клас та шаблон стратегії:
public string calculateTax(string name)
{
InameHandler nameHandler = NameHandlerFactory::getHandler(name);
nameHandler->calculateTax($salary);
}
Тепер, якщо я використовував TDD, я мав би кілька тестів, які працюють на оригіналі calculateTax()перед рефакторингом.
колишній:
calculateTax_givenChrisSalaryBelowThreshold_Expect111(){}
calculateTax_givenChrisSalaryAboveThreshold_Expect111(){}
calculateTax_givenDavidSalaryBelowThreshold_Expect222(){}
calculateTax_givenDavidSalaryAboveThreshold_Expect222(){}
calculateTax_givenScottSalaryBelowThreshold_Expect333(){}
calculateTax_givenScottSalaryAboveThreshold_Expect333(){}
Після рефакторингу у мене буде клас Фабрика NameHandlerFactoryі принаймні 3 впровадження InameHandler.
Як слід перейти до рефакторних тестів? Чи слід видалити тест одиниці claculateTax()з EmployeeTestsі створити тестовий клас для кожної реалізації InameHandler?
Чи слід перевіряти і заводський клас?
salaryдо функціїcalculateTax(). Таким чином, я думаю, я буду дублювати тестовий код для оригінальної функції та 3 реалізації класу стратегії.