如何针对单元测试目的改变"今天的日期"?

ck.*_*ck. 5 c# datetime unit-testing

我使用VS2008目标.NET 2.0框架,以防万一,不,我不能改变这个:)

DateCalculator上课了.其方法GetNextExpirationDate尝试在内部使用DateTime.Today作为基线日期来确定下一个到期时间.

在我编写单元测试时,我意识到我想测试GetNextExpirationDate不同的"今天"日期.

最好的方法是什么?以下是我考虑过的一些替代方案:

  • 使用参数公开property/overloaded方法,baselineDate仅在单元测试中使用它.在实际的客户端代码,忽略了赞成票默认方法的属性/重载方法baselineDateDateTime.Today.我不愿意这样做,因为它使得DateCalculator类的公共接口变得笨拙.
  • 创建一个baselineDate内部设置为的受保护字段DateTime.Today.测试时,DateCalculatorForTesting从构造函数派生DateCalculator并设置baslineDate.它使公共接口保持干净,但仍然不是很好 - baselineDate受到保护并且需要派生类,这两者都仅用于测试.
  • 使用扩展方法.我在添加之后尝试了这个ExtensionAttribute,然后意识到它不起作用,因为扩展方法无法访问私有/受保护的变量.我最初认为这是一个非常优雅的解决方案.:(

我有兴趣听听别人的想法.

Gis*_*shu 1

我通常在抽象/接口内收集对操作系统的调用,以便我可以轻松地测试它..就像上面提到的安德鲁一样。

然而,仅考虑到问题中提到的需要;我觉得“子类化和覆盖”是完成此任务的最简单且侵入性最小的方法 - 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)