![](/img/trans.png)
[英]unittest.Mock - Combining return_value and side_effect
[英]python mock side_effect or return_value dependent on call_count
为了测试轮询函数,我想模拟子函数的调用,以便第一次调用它会失败,第二次调用它会成功。 这是它的一个非常简化的版本:
poll_function(var1):
value = sub_function(var1) # First call will return None
while not value:
time.sleep(POLLING_INTERVAL)
value = sub_function(var1) # A subsequent call will return a string, e.g "data"
return value
这可能与mock
框架中的Mock
对象有关吗? 我知道Mock
对象有一个call_count
属性,我应该能够以某种方式使用。
现在我已经通过创建一个自定义模拟对象来解决它,我用它来修补sub_function()
,但我觉得应该有一种更好的不那么冗长的方法:
def test_poll():
class MyMock(object):
def __init__(self, *args):
self.call_count = 0
def sub_function(self, *args, **kwargs):
if self.call_count > 1:
return "data"
else:
self.call_count += 1
return None
my_mock = MyMock()
with patch('sub_function', my_mock.sub_function):
ok_(poll_function())
如果我正确理解您的问题,您可以通过将side_effect
设置为 iterable 来实现。 对于您的简单案例:
>>> mock_poll = Mock(side_effect=[None, 'data'])
>>> mock_poll()
None
>>> mock_poll()
'data'
如果您想允许无限数量的调用,请使用itertools
cycle
和chain
函数:
>>> mock_poll = Mock(side_effect=chain(['first'], cycle(['others'])))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.