unittest unit test mock python mocking

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 {}