Se ho una funzione nel mio codice che va come:
class Employee{
public string calculateTax(string name, int salary)
{
switch (name)
{
case "Chris":
doSomething($salary);
case "David":
doSomethingDifferent($salary);
case "Scott":
doOtherThing($salary);
}
}
Normalmente refactoring questo per usare il Ploymorphism usando una classe di fabbrica e un modello di strategia:
public string calculateTax(string name)
{
InameHandler nameHandler = NameHandlerFactory::getHandler(name);
nameHandler->calculateTax($salary);
}
Ora, se stessi usando TDD, avrei alcuni test che funzionano sull'originale calculateTax()prima del refactoring.
ex:
calculateTax_givenChrisSalaryBelowThreshold_Expect111(){}
calculateTax_givenChrisSalaryAboveThreshold_Expect111(){}
calculateTax_givenDavidSalaryBelowThreshold_Expect222(){}
calculateTax_givenDavidSalaryAboveThreshold_Expect222(){}
calculateTax_givenScottSalaryBelowThreshold_Expect333(){}
calculateTax_givenScottSalaryAboveThreshold_Expect333(){}
Dopo il refactoring avrò una classe Factory NameHandlerFactorye almeno 3 implementazioni di InameHandler.
Come devo procedere con il refactoring dei miei test? Devo eliminare il test unitario claculateTax()da EmployeeTestse creare una classe Test per ogni implementazione di InameHandler?
Devo testare anche la classe Factory?
salaryalla funzionecalculateTax(). In questo modo penso che duplicherò il codice di test per la funzione originale e le 3 implementazioni della classe di strategia.