我使用VS2008的目标.NET 2.0框架,以防万一,我不能改变这一点:)单元测试目的如何改变“今天的日期”?
我有一个DateCalculator
类。其方法GetNextExpirationDate
尝试确定下一个到期日,内部使用DateTime.Today
作为基准日期。
当我写单元测试时,我意识到,我想测试GetNextExpirationDate
不同的“今天”的日期。
这样做的最好方法是什么?以下是我考虑过的一些替代方案:
- 公开一个属性/重载方法,参数为
baselineDate
,仅在单元测试中使用它。在实际客户端代码中,忽略属性/重载方法而偏向于默认为baselineDate
至DateTime.Today
的方法。我不愿意这样做,因为它使DateCalculator类的公共接口很尴尬。 - 创建一个名为
baselineDate
保护字段在内部设置为DateTime.Today
。测试时,从DateCalculator
派生DateCalculatorForTesting
,通过构造方法设置baslineDate
。它保持公共接口清洁,但仍然不是很好 -baselineDate
已被保护,并且需要派生类,两者都仅用于测试。 - 使用扩展方法。我在添加
ExtensionAttribute
后试过,然后意识到它不起作用,因为扩展方法无法访问私有/受保护的变量。我最初认为这确实是一个非常优雅的解决方案。 :(
我会很乐意听取别人的想法。
好问题...这将是有趣不得不等待,直到一个特定的日期找到你的测试失败,因为你依靠什么“今天”的是,不能增加它:) – slugster 2010-03-20 05:40:42
重复:HTTP: //stackoverflow.com/questions/2425721/unit-testing-datetime-now – 2010-03-20 11:14:04
感谢您的所有输入。日期时间提供者方法也是我应该考虑的事情。然而,在这种情况下,我认为我会按照Gishu的方法行事 - 对我来说,这似乎是最少的工作,也是最不具有侵入性的。 – 2010-03-20 22:42:30