2011-06-15 22 views
14

Estoy tratando de usar Mock, para simular una función en python. Aquí está mi código:Retorno Iterable con Mock Python

resp, content = request(...) 

La función request() debe devolver dos valores. Esto es lo que he intentado:

with patch("syncdatetime.py") as sync_mock: 
     sync_mock.request.return_value = [obj, ''] 

Pero cuando corro la prueba, me sale el error "objeto Mock no es iterable." La función de solicitud devuelve un objeto de tipo Mock en lugar de una lista. ¿Cómo puedo parchear la función de solicitud para que devuelva una lista?

Respuesta

7

Nota de la divulgación, soy nuevo para burlarse así que no soy un experto, sin embargo, sólo han sufrido el mismo problema y encontró que establecer el atributo side_effect a una función que devuelve una matriz fija cosas

Desde su código de ejemplo, cambie:

with patch("syncdatetime.py") as sync_mock: 
    sync_mock.request.return_value = [obj, ''] 

a

with patch("syncdatetime.py") as sync_mock: 
    sync_mock.request.side_effect = function_returning_list 

y definir

def function_returning_list(arg_list_of_choice): 
    #anything you want to do goes here 
    #then 
    return your_list 
+2

No he intentado esto pero encontré una solución más simple. En lugar de parchear el módulo, parchee la función y luego configure patch.return_value. Honestamente, no estoy del todo seguro de por qué funciona, pero de esta manera, la función no devuelve un objeto falso. Gracias por la respuesta, sin embargo. – Matt

7

Sospecho que su problema es que no está utilizando la instancia de simulacro que cree que es. Por defecto, una instancia de Mock devuelve un Mock cuando se le llama.

>>> m = mock.Mock() 
>>> type(m()) 
<class 'mock.mock.Mock'>  

Parece que su llamada a request está volviendo una maqueta porque el return_value no se ha inicializado lo que significa que resp, content = request() está tratando de descomprimir un objeto de burla.

>>> m = mock.Mock() 
>>> (a, b) = m() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'Mock' object is not iterable 

No debería ser necesario utilizar side_effect para devolver una lista. Asignar return_value debería funcionar.

>>> m = mock.Mock() 
>>> m.return_value = ['a', 'b'] 
>>> (a, b) = m() 
>>> a 
'a' 
>>> b 
'b'