2015-07-09 1 views
3

Предположим, что у меня есть function:Как писать время зависимый тесты Python

def third_day_from_now(): 
    return datetime.date.today() + datetime.timedelta(days=3) 

Я хочу писать тесты для этой функции? Я знаю, что если сегодня 25th, тогда функция должна вернуть 28. Есть ли способ каким-то образом я могу заставить объект datetime вернуть current date как 25?

ответ

3

freezegun делает насмешливый DateTime очень просто.

from freezegun import freeze_time 

@freeze_time("2015-02-25") 
def test_third_day_from_now(): 
    assert third_day_from_now() == datetime.datetime(2015, 2, 28) 
1

функция обновления, чтобы получить дату ввода в качестве аргумента (значение по умолчанию в None)

Тогда функцию тестирования путем вызова с аргументом т.е. дат и без аргументов.

Demo

>>> def third_day_from_now(input_date=None): 
...  if input_date: 
...   return input_date + datetime.timedelta(days=3) 
...  else: 
...   return datetime.date.today() + datetime.timedelta(days=3) 
... 

>>> print "Today + 3:", third_day_from_now() 
Today + 3: 2015-07-12 

>>> input_date = datetime.datetime.strptime('25-05-2015', "%d-%m-%Y").date() 
>>> print "Custom Date:", input_date 
Custom Date: 2015-05-25 
>>> print "Custom Date + 3:", third_day_from_now(input_date) 
Custom Date + 3: 2015-05-28 
0

Нет, не будет пытаться изменить системные часы, а вы могли бы изменить функцию на то, что вы можете проверить:

def third_day_from(someday): 
    """Returns the day three days after someday 
    :param someday: a datetime to start counting from 
    """ 
    return someday + datetime.timedelta(days=3) 

def test_third_day(...) 
    today = datetime(25, 5, 2005) 
    thirdday = datetime(28, 5, 2005) 
    self.assertEqual(third_day_from(today), thirdday)