Почему бы просто не использовать DateTime.Now? - PullRequest
0 голосов
/ 07 февраля 2019

Я пытался узнать об интерфейсах в последнее время.

Я видел этот кусок кода и не могу понять, почему вы просто не используете DateTime.Now самостоятельно.Я не уверен, почему интерфейс полезен, кто-то может объяснить, пожалуйста?Автор книги попытался объяснить, но я не совсем понимаю, как реализовать это так, как они говорят:

Потерял ли программист себя в море абстракций?У вас может возникнуть соблазн так думать, но на самом деле это довольно умно.Представьте, что вам нужно выполнить несколько тестов в классе, который дает разные результаты в зависимости от текущего времени (или даты).Это не редкость вообще;может быть, это финансовое приложение, которое должно получить обменный курс на определенную дату.Поэтому попробуйте проверить это, если кодовая база имеет DateTime.Now непосредственно в методах.С помощью INowResolver вы можете ввести свое сейчас и проверить на вчера, сейчас и завтра

public interface INowResolver { DateTime GetNow(); } 

public class NowResolver : INowResolver { 
   public DateTime GetNow() {  
       return DateTime.Now;     
   } 
}

Когда я проверял его, результат был таким же, если я использовал метод NowResolver.GetNow или просто использовал DateTime.Now.

Тест:

        NowResolver now = new NowResolver();
        Console.WriteLine(now.GetNow());
        Console.WriteLine(DateTime.Now);
        System.Threading.Thread.Sleep(1000);
        Console.WriteLine(now.GetNow());
        Console.WriteLine(DateTime.Now);

Выход:

07/02/2019 15:14:56
07/02/2019 15:14:56
07/02/2019 15:14:57
07/02/2019 15:14:57

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Когда вы пишете модульные тесты, важно, чтобы тесты выполнялись одинаково, каждый раз, когда вы их запускаете.

Если ваш тест (или тестируемый код) использует DateTime.Now (илиDateTime.UtcNow), то при каждом запуске вы будете получать другой результат теста (при условии, что вы тестируете свойство, содержащее DateTime).

Если вы абстрагируете DateTime в интерфейс, выможно сделать так, чтобы при выполнении теста он всегда возвращал одно и то же время при вызове INowResolver.Now.

Пример: В этом тесте время всегда будет 1 января 2018.

public class MyTest
{
    public class TestNow : INowResolver
    {
       public DateTime Now {get;set;}
       public DateTime GetNow() => Now;
    }

    [Test]
    public void MyTest()
    {
       var resolver = new TestNow { Now = new DateTime(2018,1,1) }

       var testClass = new TestClass(resolver);

    }
}

На самом деле, если во всех случаях я использовал этот метод, Now - это свойство, как и в DateTime.Now, а не функция.

0 голосов
/ 07 февраля 2019

В реализации NowResolver будет использоваться DateTime.Now.Другая реализация может иметь GetNow, которая возвращает последнюю субботу или вчера и т. Д.

Интерфейс гарантирует, что каждая версия, каждая реализация будет предоставлять метод GetNow.Именно сам класс определяет, что GetNow значит для него.

0 голосов
/ 07 февраля 2019

Здесь, как указывает книга, речь идет о тестах.

Допустим, у вас есть логика, которая должна сделать что-то особенное в субботу.Вы хотите написать тест для этого (вполне естественно).При непосредственном использовании DateTime.Now ваш тест можно запустить только в субботу .Используя интерфейс, вы можете получить макет, что всегда возвращает дату в субботу, поэтому тест можно запустить в любое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...