Я начал следовать TDD в своем проекте. Но с тех пор, как я начал, даже после прочтения некоторых статей, я сбит с толку, поскольку разработка замедлилась. Всякий раз, когда я реорганизую свой код, мне нужно изменить существующие тестовые примеры, которые я написал ранее, потому что в противном случае они начнут давать сбой.
Ниже приведен пример класса, который я недавно реорганизовал:
public class SalaryManager
{
public string CalculateSalaryAndSendMessage(int daysWorked, int monthlySalary)
{
int salary = 0, tempSalary = 0;
if (daysWorked < 15)
{
tempSalary = (monthlySalary / 30) * daysWorked;
salary = tempSalary - 0.1 * tempSalary;
}
else
{
tempSalary = (monthlySalary / 30) * daysWorked;
salary = tempSalary + 0.1 * tempSalary;
}
string message = string.Empty;
if (salary < (monthlySalary / 30))
{
message = "Salary cannot be generated. It should be greater than 1 day salary.";
}
else
{
message = "Salary generated as per the policy.";
}
return message;
}
}
Но теперь я много чего делаю в одном методе, поэтому, чтобы следовать принципу единой ответственности (SRP), я реорганизовал его на что-то вроде ниже:
public class SalaryManager
{
private readonly ISalaryCalculator _salaryCalculator;
private readonly SalaryMessageFormatter _messageFormatter;
public SalaryManager(ISalaryCalculator salaryCalculator, ISalaryMessageFormatter _messageFormatter){
_salaryCalculator = salaryCalculator;
_messageFormatter = messageFormatter;
}
public string CalculateSalaryAndSendMessage(int daysWorked, int monthlySalary)
{
int salary = _salaryCalculator.CalculateSalary(daysWorked, monthlySalary);
string message = _messageFormatter.FormatSalaryCalculationMessage(salary);
return message;
}
}
public class SalaryCalculator
{
public int CalculateSalary(int daysWorked, int monthlySalary)
{
int salary = 0, tempSalary = 0;
if (daysWorked < 15)
{
tempSalary = (monthlySalary / 30) * daysWorked;
salary = tempSalary - 0.1 * tempSalary;
}
else
{
tempSalary = (monthlySalary / 30) * daysWorked;
salary = tempSalary + 0.1 * tempSalary;
}
return salary;
}
}
public class SalaryMessageFormatter
{
public string FormatSalaryCalculationMessage(int salary)
{
string message = string.Empty;
if (salary < (monthlySalary / 30))
{
message = "Salary cannot be generated. It should be greater than 1 day salary.";
}
else
{
message = "Salary generated as per the policy.";
}
return message;
}
}
Возможно, это не лучший из примеров. Но главное в том, что как только я провел рефакторинг, мои существующие тестовые примеры, которые я написал для SalaryManager
, начали давать сбои, и мне пришлось исправить их с помощью имитации.
Это происходит постоянно в сценариях времени чтения, и вместе с этим увеличивается время разработки. Я не уверен, правильно ли я делаю TDD. Пожалуйста, помогите мне понять.
CalculateSalaryAndSendMessage
принимает два целых числа и возвращаетstring
. У вас нет других зависимостей, поэтому ваши тесты должны соответствовать любому рефакторингу. Единственное возможное изменение, которое я вижу - добавьте новые аргументы для конструктораSalaryManager
. Вам даже не нужно писать макет - пройдите реальные реализации, и тесты будут работать. - person Fabio   schedule 19.03.2018SalarayCalculator
- передатьSalaryManager
в тестах. Имитируйте только зависимости, которые замедляют ваши тесты (чтение / запись файлов, баз данных, веб-сервисов или других внешних ресурсов). 3. - без имитации ваши тесты останутся прежними, и вы сможете рефакторироватьSalaryManager
класс, не касаясь тестов. - person Fabio   schedule 19.03.2018