簡體   English   中英

unittest Mock-補丁返回值

[英]unittest Mock - patch return value

我想我誤會了如何使用模擬來更改函數的返回值。 這是我的測試:

from path.to import programme_finder
@patch('path.to.programme_finder._calc_update_interval')
def test_refresh_interval(self,method_mock):
    today = datetime.datetime.now()
    dd = datetime.timedelta(millisecond=20)
    earlier_date = today - dd
    #The normal function returns a 5 day interval.
    # For tests I want it down to 20ms
    method_mock.return_value = earlier_date
    #Here I would expect a date object, instead I get MagicMock
    print("Calc returns %s " % programme_finder._calc_update_interval)
    # rest of the test irrelevant 
    self.fail("need to time responce time")

我究竟做錯了什么 ? 如何獲取programme_finder._calc_update_interval以返回修補的datetime

試過了

assert programme_finder._calc_update_interval == earlier_date

以及它失敗。

#programme_finder.py
def _calc_update_interval():
    today = datetime.datetime.now()
    # The days we want to subtract for today.
    update_interval = current_app.config.get("RESOURCE_UPDATE_INTERVAL")
    dd = datetime.timedelta(days=update_interval)
    # Find which date it was x days ago 
    earlier_date = today - dd
    return earlier_date

在我看來,您沒有在調用該函數-您是在按名稱引用它,因此您可以返回模擬函數而不是模擬返回值。

print("Calc returns %s " % programme_finder._calc_update_interval )
                                                                 ^reference

應該

print("Calc returns %s " % programme_finder._calc_update_interval() )
                                                                 ^^call

問題似乎是_calc_update_interval是屬性(我猜是用@property裝飾器創建的)而不是方法。 最簡單的方法是簡單地使用模擬提供的PropertyMock類( 在此處記錄 ):

@patch('path.to.programme_finder._calc_update_interval', new_callable=PropertyMock):
def test_refresh_interval(self,method_mock):
    #...

暫無
暫無

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

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