代码之家  ›  专栏  ›  技术社区  ›  Syntax Error ine

为什么不直接用日期时间。现在?

  •  0
  • Syntax Error ine  · 技术社区  · 6 年前

    我最近一直在尝试学习接口。

    我看到了这段代码,我无法理解为什么你不使用 DateTime.Now 独自一人。我不确定为什么界面有用,有人能解释一下吗?这本书的作者试图解释,但我并不真正理解如何按照他们所说的方式来实现它:

    程序员是否迷失在抽象的海洋中?你可能是 想这么想,但实际上这很聪明。想象你 必须在给出不同结果的类上运行一些测试 取决于当前时间(或日期)。这并不罕见; 也许它是一个需要获得汇率的金融应用程序 在给定的日期。所以尝试测试代码库是否具有日期时间。 直接在方法中。有了InowreSolver,你现在可以注入你的 测试昨天,现在和明天

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

    当我测试它时,如果我使用 NowResolver.GetNow 方法或刚刚使用的方法 日期时间 .

    测试:

            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 回复  |  直到 6 年前
        1
  •  8
  •   Neil    6 年前

    在编写单元测试时,每次运行测试时,以完全相同的方式执行测试是很重要的。

    如果您的测试(或正在测试的代码)使用 DateTime.Now (或) DateTime.UtcNow ,则每次运行它时,都会得到不同的测试结果(假设您正在测试包含said的属性) DateTime )

    如果你抽走 日期时间 在一个接口中,您可以这样做:当您的测试运行时,当 INowResolver.Now 被称为。

    例子: 在此测试中,时间始终为2018年1月1日。

    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 是一种财产,就像它在 日期时间 ,不是函数。

        2
  •  4
  •   BradleyDotNET Aniss    6 年前

    正如书中所指出的,这里的重点是测试。

    假设你有逻辑需要在周六做一些特别的事情。您希望为此编写一个测试(非常自然)。使用 DateTime.Now 直接测试只能运行 在星期六 . 使用这个界面,你可以得到一个模拟 总是 返回星期六的日期,因此测试可以随时运行。

        3
  •  0
  •   Andy G    6 年前

    这个 NowResolver 实施将使用 DateTime.Now . 另一个实现可能 GetNow 上周六、昨天等。

    接口保证每个版本、每个实现将提供 盖特诺 方法。是类本身决定了 盖特诺 意味着它。