热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么不直接使用DateTime.Now?

如何解决《为什么不直接使用DateTime.Now?》经验,为你挑选了1个好方法。

我最近一直在努力学习接口.

我看到了这段代码,无法解决为什么你不能单独使用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

Neil.. 9

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

如果您的测试(或正在测试的代码)使用DateTime.Now(或DateTime.UtcNow),那么每次运行时您将获得不同的测试结果(假设您正在测试包含所述测试的属性DateTime).

如果你抽象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属于一个属性,就像它所在的那样DateTime.Now,而不是一个函数.



1> Neil..:

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

如果您的测试(或正在测试的代码)使用DateTime.Now(或DateTime.UtcNow),那么每次运行时您将获得不同的测试结果(假设您正在测试包含所述测试的属性DateTime).

如果你抽象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属于一个属性,就像它所在的那样DateTime.Now,而不是一个函数.


推荐阅读
  • 介绍平常在多线程开发中,总避免不了线程同步。本篇就对net多线程中的锁系统做个简单描述。目录一:lock、Monitor1:基础 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了在C#中SByte类型的GetHashCode方法,该方法用于获取当前SByte实例的HashCode。给出了该方法的语法和返回值,并提供了一个示例程序演示了该方法的使用。 ... [详细]
  • C#设计模式之八装饰模式(Decorator Pattern)【结构型】
    一、引言今天我们要讲【结构型】设计模式的第三个模式,该模式是【装饰模式】,英文名称:DecoratorPattern。我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理 ... [详细]
  • 原创我的网址http:blog.csdn.nethsuyuan如有错误请指正八.类对于面向对象语言来说,类是重头戏,C#中类的使用和C++中类似,在细节方面有些 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
  • 如何设置定时器在c#中的特定时间执行我有一个要求,我需要在每天00:01:00AM执行计时器…但我没有得到如何实现这一点..如果我正在采取系统时间,它可以是不同的格式. ... [详细]
  • (MSOA)微型面向服务的架构的设计与实现
    设计目的:1、系统按照功能或者业务逻辑层次划分服务,系统架构清晰、灵活;2、提供服务自动注册;3、服务调用简单,服务之间的调用可以通过getXXXService()直接获得;4、服务统一管理;5、服务 ... [详细]
author-avatar
泄漏磁的_956
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有