Jeśli mam w kodzie funkcję, która wygląda następująco:
class Employee{
public string calculateTax(string name, int salary)
{
switch (name)
{
case "Chris":
doSomething($salary);
case "David":
doSomethingDifferent($salary);
case "Scott":
doOtherThing($salary);
}
}
Normalnie przefakturowałbym to, aby użyć Ploymorfizmu przy użyciu fabrycznego wzorca klasy i strategii:
public string calculateTax(string name)
{
InameHandler nameHandler = NameHandlerFactory::getHandler(name);
nameHandler->calculateTax($salary);
}
Teraz, gdybym używał TDD, miałbym kilka testów, które działają na oryginale calculateTax()
przed refaktoryzacją.
dawny:
calculateTax_givenChrisSalaryBelowThreshold_Expect111(){}
calculateTax_givenChrisSalaryAboveThreshold_Expect111(){}
calculateTax_givenDavidSalaryBelowThreshold_Expect222(){}
calculateTax_givenDavidSalaryAboveThreshold_Expect222(){}
calculateTax_givenScottSalaryBelowThreshold_Expect333(){}
calculateTax_givenScottSalaryAboveThreshold_Expect333(){}
Po refaktoryzacji będę miał klasę Factory NameHandlerFactory
i co najmniej 3 implementacje InameHandler
.
Jak przejść do refaktoryzacji moich testów? Powinienem usunąć testów jednostkowych dla claculateTax()
od EmployeeTests
i utworzyć klasę testową dla każdej implementacji InameHandler
?
Czy powinienem również przetestować klasę Factory?
salary
do funkcjicalculateTax()
. W ten sposób myślę, że powielę kod testowy oryginalnej funkcji i 3 implementacje klasy strategicznej.