2012-07-05 16 views
16

Io sto cercando di ottenere mock.patch a lavorare il seguente pezzo di codice di esempio:patch Mock da/istruzione import in Python

from mock import patch 
from collections import defaultdict 

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

Emette il seguente:

d: defaultdict(None, {}) 

Il che significa quel defaultdict non è stato patchato.

Se si sostituisce la dichiarazione/importazione con un istruzione import dritto funziona:

from mock import patch 
import collections 

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

uscita è:

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

C'è un modo per rattoppare una chiamata utilizzando da/importazione?

Grazie

risposta

21

Se stai patch qualcosa nello stesso modulo, è possibile utilizzare __main__:

from mock import patch 
from collections import defaultdict 

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

Se stai beffardo qualcosa per un modulo importato, tuttavia, vorrete di utilizzare il nome di quel modulo in modo è patchato il riferimento corretto (o il nome):

# 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() 

il punto qui è che cerotto vuole che il percorso completo alla cosa è patch. Questo sembra un po 'strano quando si aggiusta qualcosa nel modulo corrente, dal momento che la gente non usa spesso __main__ (o deve fare riferimento al modulo corrente, per quello).

7

patch funziona con patch nomi. Non è possibile ottenere nulla rattoppando il nome collections.defaultdict se si utilizza il nome defaultdict (nello spazio dei nomi locale) per accedere all'oggetto. Vedere la documentazione allo http://www.voidspace.org.uk/python/mock/patch.html#id1.

+3

Questo non significa che i test di unità inizieranno silenziosamente a comportarsi in modo molto, molto diverso se si modificano i dettagli dell'implementazione sia che si utilizzi 'da X import Y' o' import X.Y'? – detly

+0

@detly: Credo che sia vero, anche se non ho molta familiarità con la simulazione, quindi non posso dire per esperienza. – BrenBarn

+0

@detly sì, è corretto – Daenyth