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 NameHandlerFactory
e almeno 3 implementazioni di InameHandler
.
Come devo procedere con il refactoring dei miei test? Devo eliminare il test unitario claculateTax()
da EmployeeTests
e creare una classe Test per ogni implementazione di InameHandler
?
Devo testare anche la classe Factory?
salary
alla funzionecalculateTax()
. In questo modo penso che duplicherò il codice di test per la funzione originale e le 3 implementazioni della classe di strategia.