Si j'ai une fonction dans mon code qui va comme:
class Employee{
public string calculateTax(string name, int salary)
{
switch (name)
{
case "Chris":
doSomething($salary);
case "David":
doSomethingDifferent($salary);
case "Scott":
doOtherThing($salary);
}
}
Normalement, je refactoriserais ceci pour utiliser le ploymorphisme en utilisant une classe d'usine et un modèle de stratégie:
public string calculateTax(string name)
{
InameHandler nameHandler = NameHandlerFactory::getHandler(name);
nameHandler->calculateTax($salary);
}
Maintenant, si j'utilisais TDD, j'aurais des tests qui fonctionnent sur l'original calculateTax()
avant de refactoriser.
ex:
calculateTax_givenChrisSalaryBelowThreshold_Expect111(){}
calculateTax_givenChrisSalaryAboveThreshold_Expect111(){}
calculateTax_givenDavidSalaryBelowThreshold_Expect222(){}
calculateTax_givenDavidSalaryAboveThreshold_Expect222(){}
calculateTax_givenScottSalaryBelowThreshold_Expect333(){}
calculateTax_givenScottSalaryAboveThreshold_Expect333(){}
Après refactoring, j'aurai une classe Factory NameHandlerFactory
et au moins 3 implémentations de InameHandler
.
Comment dois-je procéder pour refactoriser mes tests? Dois-je supprimer le test unitaire claculateTax()
de EmployeeTests
et créer une classe de test pour chaque implémentation de InameHandler
?
Dois-je également tester la classe Factory?
salary
à la fonction acalculateTax()
été ajoutée. De cette façon, je pense que je vais dupliquer le code de test pour la fonction d'origine et les 3 implémentations de la classe de stratégie.