簡體   English   中英

python中的模擬函數參數

[英]mock function arguments in 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())

在單元測試中,我正在運行refresh_settlement_date()任務,但在調用get_next_friday()時未提供base_date ,我的問題是如何模擬該參數以測試將來的日子?

我試圖避免將參數添加為refresh_settlement_date(base_date)因為它不是真正的目的,而僅用於單元測試。

一種替代方法是修補當前日期。

有一個具有多個選項的相關線程:


我最喜歡的選擇是使用名為freezegun的第三方模塊。

您只需要添加一行即可,非常清晰易讀:

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

您需要@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

我只是嘗試了一下,它似乎有效:

首先,我需要復制函數:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM