Python 中的模拟函数参数

问题描述 投票:0回答:3

假设我有这个功能

from datetime import date

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

然后我有一个 celery 任务来调用这个函数而不传入

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)
,因为它没有真正的目的,而仅用于单元测试。

python django mocking unit-testing
3个回答
4
投票

另一种方法是修补当前日期。

有一个具有多个选项的相关线程:


我最喜欢的选择是使用名为

freezegun
的第三方模块。

您只需要添加一行,非常干净且可读:

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

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

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()
© www.soinside.com 2019 - 2024. All rights reserved.