unittest模拟补丁返回值

2024-05-01 21:49:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我想我误解了如何使用mock来更改函数返回值。这是我的测试:

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?在

试过了

^{pr2}$

而且失败了。在

#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

Tags: topathtodaydatetimedatefinderdefupdate
2条回答

在我看来,你没有调用你所引用的函数的名字,所以你得到了模拟函数,而不是你的模拟返回值。在

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

应该是

^{pr2}$

问题似乎是_calc_update_interval是一个属性(我猜是用@property修饰符创建的),而不是一个方法。最简单的方法是简单地使用mock(文档化的here)提供的PropertyMock类:

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

相关问题 更多 >