目前我正在编写一个组件的单元测试,该组件测试日期时间特定。我创建了IDateTimeProvider
接口,它可以直接作为DateTime.UtcNow
包装和业务对象使用接口而不是DateTime
。看起来DateTime有点超载,应该分成一个值和一个从操作系统获取该值的东西。我想知道是否有一个特定的原因,不在.NET中有一个接口(IDateTimeProvider
)(IClock
)?为什么在.NET中没有IDateTimeProvider并且DateTime具有Now getter?
回答
简而言之:因为BCL的大部分并不是为可测性设计的。
在“核心”功能方面,对于随机数生成也是如此 - 许多与HTTP相关的类更难以伪造:(至少在这种情况下,可以很容易地引入你自己的。时钟接口
从有利的一面,当Noda Time是可供生产使用,它不仅能提供更好的日期/时间API比BCL - 它会提供更多的测试友好的:)
我们始终如一地使用DateTimeProvider包装类,如果需要,我们可以在测试上下文中重写该类包装类...
http://learn.typemock.com/typemock-isolator/能够模拟DateTime(和其他mscorlib类型)所以DateTime.Now不再是问题。但缺点是,这可能会导致开发人员设计更糟糕的东西,因为嘲笑DateTime.Now!没有问题!
也许使用类似IDateTimeProvider的东西是更好的解决方案。
但是,如果您使用的是第三方库, DateTime TypeMock-Isolatior可能是一个解决方案/解决方法。
而且微软研究院的摩尔/支脚是凉的东西:http://channel9.msdn.com/blogs/peli/moles-replace-any-net-method-with-a-delegate(展示了如何用一个委托更换任何.NET方法/属性 - 例如DateTime.Now ;-))
不良链接?无法打开页面。 – Kimi 2011-11-28 10:23:18
我张贴了这个答案,另一个问题,但如果您正在寻找测试DateTime.Now
的简单方法,它也适用于此。
我喜欢做的是创建一个公共函数,它返回需要当前日期/时间的类中的DateTime(Func<DateTime>
),并将其设置为默认返回DateTime.Now。然后,在测试期间,我用一个测试函数覆盖它,该函数返回我想测试的任何DateTime。
public class MyClass
{
public Func<DateTime> DateTimeNow =() => DateTime.Now;
public void MyMethod()
{
var currentTime = DateTimeNow();
//... do work
}
}
public class MyClassTest
{
public void TestMyMethod()
{
// Arrange
var myClass = new MyClass();
myClass.DateTimeNow =() => new DateTime(1999, 12, 31, 23, 59, 59);
// Act
myClass.MyMethod();
// Assert
// my asserts
}
}
- 1. 为什么ASP.NET MVC 2没有default.aspx并且没有工作?
- 2. 在.NET框架中,为什么会出现PointF(float)并且没有“PointD”(double)?
- 3. 为什么.NET中没有ArgumentEmptyException?
- 4. 为什么InputStream和OutputStream实现Closeable并且Socket没有?
- 5. 为什么这个svg被裁剪并且没有缩放?
- 6. 为什么open()失败并且errno没有设置?
- 7. 为什么按钮具有动作侦听器并且命令不在LWUIT中?
- 8. 在属性的getter中为.Net 2.0调用没有Func
- 9. 为什么没有.NET社区过程?
- 10. 为什么没有.NET RuntimePropertyHandle和PropertyInfo.GetPropertyFromHandle?
- 11. 为什么DateTime是.Net中的结构?
- 12. 为什么不提升::任何有“getter”?
- 13. 为什么工具栏没有提升?
- 14. java中的Arith溢出:为什么在运行时没有异常并且没有编译器警告?
- 15. 没有什么是编辑,而且MFMailComposeViewController
- 16. 为什么currentDirectoryPath在IDE下返回不同的结果并且没有它?
- 17. 从datetime = now()
- 18. babel-loader没有发生错误并且没有错误
- 19. 为什么System.Numerics.BigInteger在Silverlight 4.0中没有Parse方法,但在.Net 4.0中有?
- 20. 为什么事件在.NET中没有返回类型?
- 21. 为什么没有Dispose方法在.Net Core中重写?
- 22. 为什么在.NET中没有Java的setAccessible?
- 23. 为什么你不能在scala中创建一个没有getter的setter?
- 24. 为什么Ruby的stdlib有DateTime类?
- 25. 为什么线程在终止时没有保持堆栈并且没有分离?
- 26. 格式.NET DateTime“日”没有前导零
- 27. 没有getter的HashMap?
- 28. 为什么没有DateTime的内置类型?
- 29. 不为空,并且在mysql工作台中没有空字符
- 30. 为什么我的代码停止并且没有返回异常?
不要忘记,System.IO ... – 2011-11-28 16:02:11