Si tengo una función en mi código que dice así:
class Employee{
public string calculateTax(string name, int salary)
{
switch (name)
{
case "Chris":
doSomething($salary);
case "David":
doSomethingDifferent($salary);
case "Scott":
doOtherThing($salary);
}
}
Normalmente refactorizaría esto para usar Ploymorphism usando un patrón de estrategia y clase de fábrica:
public string calculateTax(string name)
{
InameHandler nameHandler = NameHandlerFactory::getHandler(name);
nameHandler->calculateTax($salary);
}
Ahora, si estuviera usando TDD, tendría algunas pruebas que funcionan en el original calculateTax()antes de refactorizar.
ex:
calculateTax_givenChrisSalaryBelowThreshold_Expect111(){}
calculateTax_givenChrisSalaryAboveThreshold_Expect111(){}
calculateTax_givenDavidSalaryBelowThreshold_Expect222(){}
calculateTax_givenDavidSalaryAboveThreshold_Expect222(){}
calculateTax_givenScottSalaryBelowThreshold_Expect333(){}
calculateTax_givenScottSalaryAboveThreshold_Expect333(){}
Después de refactorizar, tendré una clase Factory NameHandlerFactoryy al menos 3 implementaciones de InameHandler.
¿Cómo debo proceder para refactorizar mis pruebas? ¿Debo eliminar la prueba unitaria claculateTax()de EmployeeTestsy crear una clase de prueba para cada implementación de InameHandler?
¿Debería probar también la clase Factory?
salarya la funcióncalculateTax(). De esta manera, creo que duplicaré el código de prueba para la función original y las 3 implementaciones de la clase de estrategia.