为什么.NET中没有IDateTimeProvider,而DateTime现在有getter?目前我正在为一个执行日期时间特定验证的组件编写单元测试。我创建了IDateTimeProvider接口,它充当DateTime.UtcNow包装器,业务对象直接使用接口而不是DateTime。看起来DateTime有点过载,应该分成一个值和从操作系统获取该值的东西。我想知道.NET中没有IDateTimeProvider(IClock)接口是否有特殊原因?简而言之:因为大多数BCL并不是为可测试性而设计的。就“核心”功能而言,随机数生成也是如此——许多与HTTP相关的类假装更糟:(至少在这种情况下,引入您自己的时钟接口相当容易。从好的方面来说,当当NodaTime准备好投入生产使用时,它不仅会提供比BCL更好的日期/时间API——它还会提供对测试更友好的API:)我们一直在使用DateTimeProvider包装类,我们可以在我们的测试环境中覆盖它如果需要它...http://learn.typemock.com/typemock-isolator/能够模拟DateTime(和其他mscorlib类型),因此DateTime.Now不再是问题。但缺点当然是这会导致开发人员将他们的东西设计得更糟,因为模拟DateTime并没有错。现在!也许使用像IDateTimeProvider这样的东西是更好的解决方案。但是,如果您使用的是3rd方库中继,例如DateTimeTypeMock-Isolatior可能是一种解决方案/解决方法。来自MicrosoftResearch的Moles/Stub也很酷:http://channel9.msdn.com/blogs/peli/moles-replace-any-net-method-with-a-delegate(演示如何替换任何.NET方法/properties)withdelegates-例如DateTime.Now;-))我将这个答案发布到另一个问题,但如果您正在寻找一种简单的方法来测试DateTime.Now,它也适用于此。我喜欢做的是在需要当前日期/时间的类中创建一个返回DateTime(Func)的公共函数,并将其设置为默认返回DateTime.Now。然后,在测试期间,我用一个测试函数覆盖它,该函数返回我想要测试的任何DateTime。以上是C#学习教程:为什么.NET中没有IDateTimeProvider,而DateTime现在有getter?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注——publicclassMyClass{publicFuncDateTimeNow=()=>DateTime.Now;publicvoidMyMethod(){varcurrentTime=DateTimeNow();//...做工作}}publicclassMyClassTest{publicvoidTestMyMethod(){//安排varmyClass=newMyClass();myClass.DateTimeNow=()=>newDateTime(1999,12,31,23,59,59);//执行myClass.MyMethod();//断言//我的断言}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
