#c# #unit-testing
#c# #модульное тестирование
Вопрос:
У меня есть следующий метод. Как я могу написать модульный тест для этой функции, чтобы убедиться, что машина добавлена в список ремонтных работ?
public void AddMachineToRepairsList()
{
Console.WriteLine("Would you like to add this Machine to the repairs list?");
var addToRepairs = Console.ReadLine().ToLower();
if (addToRepairs == "yes")
{
int cost = 0;
int hoursWorked = 0;
var machine = new Repair(cost, hoursWorked);
Repairs.Add(machine);
Console.WriteLine("Machine successfully added!");
}
else
{
Console.WriteLine("Please enter machine information again");
this.Run();
}
}
Комментарии:
1. В первой строке у вас отсутствовал
"
, который я исправил для вас.2. 1) Какую платформу модульного тестирования вы используете? 2) Обычно модульное тестирование выполняется с использованием метода, не содержащего void, чтобы определить, что возвращает функция / выдает ошибку. Что именно вы здесь ищете?
3. Вы можете абстрагировать тело функции (все, что находится после консоли. ReadLine(). Перевести ()) в отдельный тестируемый метод — и затем протестировать это (вас, вероятно, не интересует, правильно ли консоль принимает ввод / выдает вывод).
4. Поскольку этот метод сочетает в себе проблемы (вывод пользовательского интерфейса, пользовательский ввод и бизнес-логику), он не очень подходит для модульного тестирования. Разделите эти проблемы, и тогда бизнес-логику можно будет модульно протестировать.
5. Вы бы проверили содержимое исправлений после выполнения теста, наличие здесь содержимого консоли сделает это ужасным для тестирования, хотя, если у вас есть данные для чтения / записи вне метода, так что это несет одну ответственность.
Ответ №1:
Вам нужно будет передать addToRepairs в качестве параметра методу и вызвать like
Console.WriteLine("Would you like to add this Machine to the repairs list?");
var addToRepairs = Console.ReadLine().ToLower();
while(AddMachineToRepairsList(addToRepairs)==false)
{
Console.WriteLine("Please enter machine information again");
this.Run();
}
Определение было бы
public bool AddMachineToRepairsList(string option)
{
string addToRepairs = "";
if (addToRepairs == "yes")
{
int cost = 0;
int hoursWorked = 0;
var machine = new Repair(cost, hoursWorked);
Repairs.Add(machine);
Console.WriteLine("Machine successfully added!");
return true;
}
else
{
return false;
}
}
Теперь один модульный тест будет иметь значение «да», а другой — «нет». вы
можно написать модульный тест и утверждать, что возвращаемое значение равно true / false на основе переданного параметра
Комментарии:
1. Выполнение даже не достигнет метода AddMachineToRepairsList (строковый параметр). Он просто переходит к this.Run();