TDD - 如何测试基于时间的功能而不在测试中实现它?

时间:2016-03-24 19:46:23

标签: unit-testing date tdd

我在某个方面尝试了TDD并且已经遇到过这种情况了几次 例如,我的程序需要取一个数字X,并找出X天前的日期字符串,以便执行某些基于日期的查询。
所以我想我需要一个验证日期计算是否正确的测试。 但是,由于测试取决于当前日期,如何创建这样的测试? 我可以让测试方法自己实现这个确切的功能,但这只会使它变得多余......

编辑:我已经看过Setting time and date in JUnit test fixture,但那里的答案似乎对我想要实现的目标有点过分。

1 个答案:

答案 0 :(得分:2)

考虑添加另一个抽象层。

执行查询的代码不是使用当前日期,而是接受任何日期,以及从该日期减去的天数。

您是否对此功能进行测试,然后您的更高级别功能将始终传递当前日期。

// don't bother testing this function
def get_some_day_before_today(num_days_ago):
   return get_some_day_before_some_date(num_days_ago, Date.now())

// do test this function 
def get_some_day_before_some_date(num_days_before, reference_date):
    // do stuff
    return earlierDate

编辑:一些示例测试

def test_zero_days():
   zero_days_before = get_some_day_before_some_date(0, "01/01/16")

   assert_equals("01/01/16", zero_days_before)


def test_one_day():
   one_day_before = get_some_day_before_some_date(1, "02/01/16")

   assert_equals("01/01/16", one_day_before)