38

ポーリング関数をテストするために、サブ関数の呼び出しをモックして、最初に呼び出されたときに失敗し、2回目に呼び出されたときに成功するようにします。これは非常に単純化されたバージョンです。

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())         
4

1 に答える 1

66

私があなたの質問を正しく理解しているなら、あなたはiterableに設定side_effectすることによってそれをします。単純なケースの場合:

>>> 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'])))
于 2012-11-13T10:57:15.030 に答える