TDD - 如何测试基于时间的功能而不在测试中实现它?
TDD - how to test time-based functionality without implementing it within the test?
我正在一些副项目上尝试 TDD,并且已经遇到过几次。
例如,我的程序需要取一个数字 X,并找出 X 天前的日期字符串,以便执行某些基于日期的查询。
所以我想我需要一个测试来验证日期计算是否正确。
但是,由于测试取决于当前日期,如何创建这样的测试?
我可以让测试方法自己实现这个确切的功能,但这只会让它变得多余...
编辑:我看过 Setting time and date in JUnit test fixture,但那里的答案似乎对我想要实现的目标来说太过分了。
考虑再添加一个抽象层。
执行查询的代码不使用当前日期,而是采用任何日期以及从该日期减去的天数。
你测试这个功能,然后你的更高级别的功能将始终传递当前日期。
// 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)
我正在一些副项目上尝试 TDD,并且已经遇到过几次。
例如,我的程序需要取一个数字 X,并找出 X 天前的日期字符串,以便执行某些基于日期的查询。
所以我想我需要一个测试来验证日期计算是否正确。
但是,由于测试取决于当前日期,如何创建这样的测试?
我可以让测试方法自己实现这个确切的功能,但这只会让它变得多余...
编辑:我看过 Setting time and date in JUnit test fixture,但那里的答案似乎对我想要实现的目标来说太过分了。
考虑再添加一个抽象层。
执行查询的代码不使用当前日期,而是采用任何日期以及从该日期减去的天数。
你测试这个功能,然后你的更高级别的功能将始终传递当前日期。
// 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)