繁体   English   中英

python mock side_effect 或 return_value 依赖于 call_count

[英]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 cyclechain函数:

>>> mock_poll = Mock(side_effect=chain(['first'], cycle(['others'])))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM