How to let MagicMock behave like a dict?
Question: mock(<http://mock.readthedocs.org/en/latest/index.html>) is a great tool in
python for unit test. It can conveniently mock a method or class or dict.But I
encountered a problem which I couldn't find a straightforward way to deal with
by mock.

This is the function to be tested:

    
    
    def function_to_be_tested(id, responses):
        if not id in responses:
            print '%s not exist'%pole_id
            return 
    
        if id in responses.redundantErrorResponses:
            print '%s is redundant'%pole_id
            return
    
        do_something()
    

argument **responses** is a dict like object which has some other
attributes(such as redundantErrorResponses) except dict inherent features. Now
I want to construct a mock responses to let `id in responses`to be True and
`id in responses.redundantErrorResponses` to be False. This is what I do:

    
    
    pole_id = 30
    pole_value = 100
    pole_dic = {pole_id:pole_value}
    mock_responses = MagicMock()
    mock_responses.__getitem__.side_effect = lambda k: pole_dic[k]
    mock_responses.__iter__.side_effect = iter(pole_dic)
    mock_responses.redundantErrorResponses = {}
    

But error occurred:

    
    
    function_to_be_tested(pole_id, mock_responses)
    
    >>30 not exist
    

So how can I construct a MagicMock object meanwhile can iterate like a dict or
how can I construct a dict meanwhile support MagicMock features(add attribute
freely)?


Answer: Why mess around with `__iter__`? It seems to me that you want to mess with
`__contains__`:

    
    
    >>> import mock
    >>> m = mock.MagicMock()
    >>> d = {'foo': 'bar'}
    >>> m.__getitem__.side_effect = d.__getitem__
    >>> m.__iter__.side_effect = d.__iter__
    >>> m['foo']
    'bar'
    >>> 'foo' in m
    False
    >>> m.__contains__.side_effect = d.__contains__
    >>> 'foo' in m
    True
    

