2014-09-05 2 views
1

Допустим, у меня есть эта функцияфиктивные аргументы функции в Python

from datetime import date 

def get_next_friday(base_date=date.today()): 
    next_friday = ... 
    return next_friday 

Тогда у меня есть задача сельдерея, чтобы вызвать эту функцию, не проходя в base_date

@celery_app.task 
def refresh_settlement_date(): 
    Record.objects.update(process_date=get_next_friday()) 

В UnitTest я бегу refresh_settlement_date() Задача, но она не дает base_date, когда она звонит get_next_friday(), мой вопрос заключается в том, как издеваться над этим параметром для проверки дней в будущем?

Я пытаюсь избежать добавления параметра, чтобы стать refresh_settlement_date(base_date), поскольку он не служит реальной цели, а только для unittest.

ответ

1

Вы должны @patchget_next_friday() функции и подставить это возвращаемое значение с тем, что вам нужно:

date_in_the_future = date.today() + timedelta(50) 
next_friday_in_the_future = get_next_friday(base_date=date_in_the_future) 

with patch('module_under_test.get_next_friday') as mocked_function: 
    mocked_function.return_value = next_friday_in_the_future 

    # call refresh_settlement_date 
+0

Спасибо, это очень похоже на мое собственное решение –

1

Я просто попытался это, кажется, работает:

первый мне нужно скопировать функцию :

old_get_next_friday = get_next_friday 

затем пропатчить его:

with patch.object(get_next_friday) as mocked_func: 
    for i in range(8): 
     mocked_func.return_value = old_get_next_friday(date.today() + timedelta(days=i)) 
     refresh_settlement_date() 
3

Альтернативный подход заключается в том, чтобы исправить текущую дату.

Существует соответствующий поток с несколькими вариантами:


Мой любимый вариант заключается в использовании модуль стороннего под названием freezegun.

Вам нужно будет только одна линия, чтобы добавить, очень чистый и читаемым:

@freeze_time("2014-10-14") 
def test_refresh_settlement_date_in_the_future(self): 
    ... 
+0

хорошо, чтобы знать, спасибо. –

Смежные вопросы