Испытание модульного теста для функции - PullRequest
0 голосов
/ 29 мая 2019

В моем модульном тестовом файле с использованием Nunit я пытаюсь написать контрольные примеры, чтобы проверить все ветви if / else.Есть ли способ внедрить определенный DateTime.Now в этот метод при вызове его в модульном тесте?
Метод принимает время открытия / закрытия для ресторана.

public void LunchDinnerBummer(string openingTime, string closingTime)
{
    //Based on the current time, alerts the user
    //if it is lunch/dinner time or outside of 
    //business hours
    var openTime = DateTime.Parse(openingTime);
    var closeTime = DateTime.Parse(closingTime);

    //End of lunch time
    var lunchTime = DateTime.Parse("3:00 PM");

    //For lunch time
    if (openTime < DateTime.Now && DateTime.Now < lunchTime)
        Console.WriteLine("It is time to go to Ted’s for lunch!");

    //For dinner time
    else if (DateTime.Now > lunchTime && DateTime.Now < closeTime)
        Console.WriteLine("It is time to go to Ted’s for dinner!");

    //If outside of business hour before Opening Time for today
    else if (DateTime.Now < openTime)
    {
        TimeSpan span = openTime.Subtract(DateTime.Now);
        Console.WriteLine("Bummer, Ted’s is closed");
        Console.WriteLine("Ted’s will open in: " + span.Hours + " hour " + " and " + span.Minutes + " minutes ");
    }
    //If outside of business hours past closing time for today
    //Calculate for the hours and minutes left till opening time for next day
    else
    {
        var openTimeNextDay = openTime.AddDays(1);
        TimeSpan span = openTimeNextDay.Subtract(DateTime.Now);
        Console.WriteLine("Bummer, Ted’s is closed");
        Console.WriteLine("Ted’s will open in: " + span.Hours + " hour " + " and " + span.Minutes + " minutes ");
    }
}

1 Ответ

2 голосов
/ 29 мая 2019

Один из способов (IMO лучший) - просто передать текущее время в качестве аргумента.

public void LunchDinnerBummer(string openingTime, string closingTime, DateTime now)
...

Тогда ваши тесты могут использовать все виды разного времени, в то время как ваш производственный код может пройти DateTime.Now.

Выходя за рамки поставленного вопроса, я бы предположил, что LunchDinnerBummer может быть методом некоторого класса, который представляет ресторан. Если это так, я бы инициализировал время открытия и закрытия в конструкторе, упрощая LunchDinnerBummer до одного аргумента.

Больше вещей, которые вы не спрашивали :-) ... Зачем использовать string в качестве аргумента, а не DateTime?

...