python - unit - pytest mock
¿Cómo dejar que MagicMock se comporte como un dict? (2)
¿Por qué meterse con __iter__
? Me parece que quieres meterse con __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
mock ( http://mock.readthedocs.org/en/latest/index.html ) es una gran herramienta en Python para la prueba unitaria. Puede simular convenientemente un método o clase o dictado. Pero me encontré con un problema que no pude encontrar una manera directa de tratar con simulacro.
Esta es la función que se probará:
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()
las respuestas de argumento son un objeto tipo dict que tiene algunos otros atributos (como redundantErrorResponses) excepto las características inherentes de dict. Ahora quiero construir respuestas simuladas para permitir que id in responses
sean verdaderas y id in responses.redundantErrorResponses
sea falso. Esto es lo que hago:
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 = {}
Pero el error ocurrió:
function_to_be_tested(pole_id, mock_responses)
>>30 not exist
Entonces, ¿cómo puedo construir un objeto MagicMock mientras tanto puedo iterar como un dict o cómo puedo construir un dict mientras tanto soporte las características de MagicMock (agregue el atributo libremente)?
Siempre puedes simplemente crear una clase tonta para hacer lo mismo.
In [94]: class MockResponses(dict):
....: @property
....: def redundantErrorResponses(self):
....: return {}