2012-07-05 16 views
16

que estoy tratando de conseguir mock.patch a trabajar en el siguiente fragmento de código de ejemplo:parches Mock desde/sentencia import en Python

from mock import patch 
from collections import defaultdict 

with patch('collections.defaultdict'): 
    d = defaultdict() 
    print 'd:', d 

Esto da el siguiente resultado:

d: defaultdict(None, {}) 

Lo que significa ese defecto no fue corregido

Si se sustituye la declaración del/de la importación con una declaración recta importación funciona:

from mock import patch 
import collections 

with patch('collections.defaultdict'): 
d = collections.defaultdict() 
print 'd:', d 

de salida es:

d: <MagicMock name='defaultdict()' id='139953944084176'> 

¿Hay alguna manera de arreglar una llamada utilizando desde/importación?

Gracias

Respuesta

21

Si va a parchear algo en el mismo módulo, puede utilizar __main__:

from mock import patch 
from collections import defaultdict 

with patch('__main__.defaultdict'): 
    d = defaultdict() 
    print 'd:', d 

Si estás burlando de algo para un módulo importado, sin embargo, tendrá que usar el nombre del módulo de manera que sea parcheado la referencia correcta (o nombre):

# foo.py 

from collections import defaultdict 

def bar(): 
    return defaultdict() 


# foo_test.py  

from mock import patch 
from foo import bar 

with patch('foo.defaultdict'): 
    print bar() 

el punto aquí es que el parche quiere que la ruta completa a la que se parchear. Esto se ve un poco extraño cuando se aplica un parche a algo en el módulo actual, ya que la gente no suele usar __main__ (o tiene que referirse al módulo actual, para el caso).

7

patch funciona mediante el parche nombres. No puede lograr nada parcheando el nombre collections.defaultdict si está usando el nombre defaultdict (en el espacio de nombres local) para acceder al objeto. Consulte la documentación en http://www.voidspace.org.uk/python/mock/patch.html#id1.

+3

¿No significa que las pruebas unitarias comenzarán a comportarse silenciosamente de manera muy diferente si cambia los detalles de implementación de si usa 'de X import Y' o' import X.Y'? – detly

+0

@detly: Creo que es cierto, aunque no estoy muy familiarizado con el simulacro, así que no puedo decir por experiencia. – BrenBarn

+0

@detly sí, eso es correcto – Daenyth

Cuestiones relacionadas