Как модульно протестировать инструкцию if else

#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();