Se eu tiver uma função no meu código que seja como:
class Employee{
public string calculateTax(string name, int salary)
{
switch (name)
{
case "Chris":
doSomething($salary);
case "David":
doSomethingDifferent($salary);
case "Scott":
doOtherThing($salary);
}
}
Normalmente eu refatoraria isso para usar o Ploymorphism usando uma classe de fábrica e um padrão de estratégia:
public string calculateTax(string name)
{
InameHandler nameHandler = NameHandlerFactory::getHandler(name);
nameHandler->calculateTax($salary);
}
Agora, se eu estivesse usando TDD, teria alguns testes que funcionam no original calculateTax()
antes de refatorar.
ex:
calculateTax_givenChrisSalaryBelowThreshold_Expect111(){}
calculateTax_givenChrisSalaryAboveThreshold_Expect111(){}
calculateTax_givenDavidSalaryBelowThreshold_Expect222(){}
calculateTax_givenDavidSalaryAboveThreshold_Expect222(){}
calculateTax_givenScottSalaryBelowThreshold_Expect333(){}
calculateTax_givenScottSalaryAboveThreshold_Expect333(){}
Após a refatoração, terei uma classe Factory NameHandlerFactory
e pelo menos três implementações InameHandler
.
Como devo proceder para refatorar meus testes? Devo excluir o teste de unidade claculateTax()
de EmployeeTests
e criar uma classe de teste para cada implementação de InameHandler
?
Devo testar a classe Factory também?
salary
para a funçãocalculateTax()
foi adicionada. Dessa forma, acho que duplicarei o código de teste para a função original e as 3 implementações da classe de estratégia.