unittest Mock - 补丁 return 值
unittest Mock - patch return value
我想我误解了如何使用模拟来更改函数 return 值。这是我的测试:
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
到 return 我的补丁 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
问题似乎是 _calc_update_interval
是一个 属性(我猜是用 @property
装饰器创建的)而不是一个方法。最简单的方法是简单地使用 mock 提供的 PropertyMock
class(已记录 here):
@patch('path.to.programme_finder._calc_update_interval', new_callable=PropertyMock):
def test_refresh_interval(self,method_mock):
#...
在我看来,您没有调用该函数——您是按名称引用它,因此您取回了模拟函数而不是模拟 return 值。
print("Calc returns %s " % programme_finder._calc_update_interval )
^reference
应该是
print("Calc returns %s " % programme_finder._calc_update_interval() )
^^call
我想我误解了如何使用模拟来更改函数 return 值。这是我的测试:
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
到 return 我的补丁 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
问题似乎是 _calc_update_interval
是一个 属性(我猜是用 @property
装饰器创建的)而不是一个方法。最简单的方法是简单地使用 mock 提供的 PropertyMock
class(已记录 here):
@patch('path.to.programme_finder._calc_update_interval', new_callable=PropertyMock):
def test_refresh_interval(self,method_mock):
#...
在我看来,您没有调用该函数——您是按名称引用它,因此您取回了模拟函数而不是模拟 return 值。
print("Calc returns %s " % programme_finder._calc_update_interval )
^reference
应该是
print("Calc returns %s " % programme_finder._calc_update_interval() )
^^call