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)?
Why mess around with
__iter__
? It seems to me that you want to mess with__contains__
:You can always just create some silly class to do the same thing.