【发布时间】:2011-01-29 17:31:21
【问题描述】:
我使用针对 .NET 2.0 Framework 的 VS2008,并且,以防万一,不,我无法更改:)
我有一个DateCalculator 课程。它的方法GetNextExpirationDate 尝试确定下一次到期,内部使用DateTime.Today 作为基准日期。
在编写单元测试时,我意识到我想针对不同的“今天”日期测试 GetNextExpirationDate。
最好的方法是什么?以下是我考虑过的一些替代方案:
- 使用参数
baselineDate公开属性/重载方法,并且仅在单元测试中使用它。在实际的客户端代码中,忽略属性/重载方法,使用默认baselineDate为DateTime.Today的方法。我不愿意这样做,因为它会使 DateCalculator 类的公共接口变得尴尬。 - 创建一个名为
baselineDate的受保护字段,该字段在内部设置为DateTime.Today。测试时,从DateCalculator派生DateCalculatorForTesting并通过构造函数设置baslineDate。它使公共接口保持干净,但仍然不是很好 -baselineDate已被保护,并且需要派生类,两者都仅用于测试。 - 使用扩展方法。我在添加
ExtensionAttribute后尝试了这个,然后意识到它不起作用,因为扩展方法无法访问私有/受保护的变量。我最初认为这确实是一个非常优雅的解决方案。 :(
我很想听听别人的想法。
【问题讨论】:
-
好问题...不得不等到特定日期才能发现测试失败会很有趣,因为您依赖于“今天”的任何内容并且无法增加它:)
-
感谢您的所有意见。日期时间提供者方法也是我应该考虑的。然而,在这种情况下,我想我会采用 Gishu 的方法——这似乎是我工作最少、侵入性最小的方法。
标签: c# unit-testing datetime