![](/img/trans.png)
[英]Python Mocking - How to store function arguments to a mocked function in the mock that is returned?
[英]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.