ck.*_*ck. 5 c# datetime unit-testing
我使用VS2008目标.NET 2.0框架,以防万一,不,我不能改变这个:)
我DateCalculator上课了.其方法GetNextExpirationDate尝试在内部使用DateTime.Today作为基线日期来确定下一个到期时间.
在我编写单元测试时,我意识到我想测试GetNextExpirationDate不同的"今天"日期.
最好的方法是什么?以下是我考虑过的一些替代方案:
baselineDate仅在单元测试中使用它.在实际的客户端代码,忽略了赞成票默认方法的属性/重载方法baselineDate来DateTime.Today.我不愿意这样做,因为它使得DateCalculator类的公共接口变得笨拙.baselineDate内部设置为的受保护字段DateTime.Today.测试时,DateCalculatorForTesting从构造函数派生DateCalculator并设置baslineDate.它使公共接口保持干净,但仍然不是很好 - baselineDate受到保护并且需要派生类,这两者都仅用于测试.ExtensionAttribute,然后意识到它不起作用,因为扩展方法无法访问私有/受保护的变量.我最初认为这是一个非常优雅的解决方案.:(我有兴趣听听别人的想法.
我通常在抽象/接口内收集对操作系统的调用,以便我可以轻松地测试它..就像上面提到的安德鲁一样。
然而,仅考虑到问题中提到的需要;我觉得“子类化和覆盖”是完成此任务的最简单且侵入性最小的方法 - OP 提到的选项 2。
public class DateCalculator
{
public DateTime GetNextExpirationDate() { // call to GetBaseLineDate() to determine result }
virtual protected GetBaseLineDate() { return DateTime.Today; }
}
// in your test assembly
public class DateCalcWithSettableBaseLine : DateCalculator
{
public DateTime BaseLine { get; set;}
override protected GetBaseLineDate()
{ return this.BaseLine; }
}
Run Code Online (Sandbox Code Playgroud)