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 NameHandlerFactoryi co najmniej 3 implementacje InameHandler.
Jak przejść do refaktoryzacji moich testów? Powinienem usunąć testów jednostkowych dla claculateTax()od EmployeeTestsi utworzyć klasę testową dla każdej implementacji InameHandler?
Czy powinienem również przetestować klasę Factory?
salarydo funkcjicalculateTax(). W ten sposób myślę, że powielę kod testowy oryginalnej funkcji i 3 implementacje klasy strategicznej.