Jika saya memiliki fungsi dalam kode saya seperti:
class Employee{
public string calculateTax(string name, int salary)
{
switch (name)
{
case "Chris":
doSomething($salary);
case "David":
doSomethingDifferent($salary);
case "Scott":
doOtherThing($salary);
}
}
Biasanya saya akan menolak ini untuk menggunakan Ploymorphism menggunakan kelas pabrik dan pola strategi:
public string calculateTax(string name)
{
InameHandler nameHandler = NameHandlerFactory::getHandler(name);
nameHandler->calculateTax($salary);
}
Sekarang jika saya menggunakan TDD maka saya akan memiliki beberapa tes yang berfungsi pada aslinya calculateTax()sebelum refactoring.
ex:
calculateTax_givenChrisSalaryBelowThreshold_Expect111(){}
calculateTax_givenChrisSalaryAboveThreshold_Expect111(){}
calculateTax_givenDavidSalaryBelowThreshold_Expect222(){}
calculateTax_givenDavidSalaryAboveThreshold_Expect222(){}
calculateTax_givenScottSalaryBelowThreshold_Expect333(){}
calculateTax_givenScottSalaryAboveThreshold_Expect333(){}
Setelah refactoring saya akan memiliki kelas Pabrik NameHandlerFactorydan setidaknya 3 implementasi InameHandler.
Bagaimana saya harus melanjutkan untuk memperbaiki tes saya? Haruskah saya menghapus unit test claculateTax()dari EmployeeTestsdan membuat kelas Test untuk setiap implementasi InameHandler?
Haruskah saya menguji kelas Pabrik juga?
salaryke fungsicalculateTax()telah ditambahkan. Dengan cara ini saya pikir saya akan menduplikasi kode tes untuk fungsi asli dan 3 implementasi dari kelas strategi.