让我说我有这个功能
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())
在单元测试中,我正在运行refresh_settlement_date()
任务,但是当它调用base_date
时它没有提供get_next_friday()
,我的问题是如何嘲笑那个测试未来几天的参数?
我正在尝试避免将参数添加到refresh_settlement_date(base_date)
,因为它不能用于实际目的,但仅适用于单元测试。
答案 0 :(得分:3)
另一种方法是修补当前日期。
有一个有多个选项的相关主题:
我最喜欢的选项是使用名为freezegun
的第三方模块。
你只需要添加一行,非常干净和可读:
@freeze_time("2014-10-14")
def test_refresh_settlement_date_in_the_future(self):
...
答案 1 :(得分:1)
您需要@patch get_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
答案 2 :(得分: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()