2012-04-09 21 views
5

Estoy tratando de hacer algunas pruebas unitarias utilizando la biblioteca de simulacro en Python. Tengo el siguiente código:Assert call to method using Mock python

def a(): 
    print 'a' 

def b(): 
    print 'b' 
    if some condition 
     a() 

¿Cómo afirmar que una llamada de b se ha hecho cuando se ha hecho una llamada fingida a b? He probado el siguiente código, pero ha fallado:

mymock=Mock() 
mymock.b() 
assertTrue(a.__call__ in mymock.mock_calls) 

Por alguna razón, creo que la mymock.b() no tiene nada que ver con el método b(). ¿Qué se puede hacer por esto?

Respuesta

7

Si un parche a, puede asegurarse de que se llamaba así:

with mock.patch('__main__.a') as fake_a: 
    b() 
    fake_a.assert_called_with() 

Si el método está en un módulo diferente:

import mymodule 

with mock.patch('mymodule.a') as fake_a: 
    mymodule.b() 
    fake_a.assert_called_with() 
+0

obtengo AttributeError: __exit__ –

+0

¿Estás utilizando el módulo de simulacro o haciendo un Mock()? Para esto, simplemente necesita 'import mock' – Sionide21

+0

haciendo un objeto Mock –

3

Somehow, I think that the mymock.b() has nothing to do with the method b() What can be done for this?

Tienes razón. Cuando te burlas de un objeto, estás dando a entender que no te importa lo que hace tu burla detrás de escena. Si quería asegurarse de que se llamara a desde b, querría patcha en b.

>>> from mock import patch 
>>> with patch('__main__.a') as patch_a: 
...  b() 
...  patch_a.assert_called_with() 

Así, la moraleja de la historia es, simulada o parche sobre el objeto que se desea medir sin tener que llamar, no el objeto cuya aplicación le interesan. En este caso, usted se preocupa por b y desea saber cómo se usa a. Como no nos importa lo que haga a, solo que se está llamando, podemos parcharlo.

Además, si desea más detalles sobre las llamadas a a, en lugar de assert_called_with puede analizar todas las llamadas realizadas accediendo al atributo parches mock_calls. En este caso sería patch_a.mock_calls.

+0

He probado el parche. todavía obtengo un error de atributo –

+0

He utilizado este código con lo que has publicado anteriormente (la única diferencia es que sustituí 'alguna condición' por' Verdadero: '). Funcionó sin error. Si obtiene un error, ** edite su pregunta ** y publique el código real que le está dando problemas y un seguimiento de la pila. Sin esa información, no puedo hacer nada para ayudarlo a solucionar los problemas. – Wilduck