Якщо у мене в коді функція така:
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 реалізації класу стратегії.