2013-07-18 25 views
9

Sto usando la libreria Python mock. So come deridere un metodo istanza classe seguendo il document:Variabile istanza classe mock Python

>>> def some_function(): 
...  instance = module.Foo() 
...  return instance.method() 
... 
>>> with patch('module.Foo') as mock: 
...  instance = mock.return_value 
...  instance.method.return_value = 'the result' 
...  result = some_function() 
...  assert result == 'the result' 

Tuttavia, ha cercato di deridere una variabile istanza classe ma non funziona (instance.labels nell'esempio seguente):

>>> with patch('module.Foo') as mock: 
...  instance = mock.return_value 
...  instance.method.return_value = 'the result' 
...  instance.labels = [1, 1, 2, 2] 
...  result = some_function() 
...  assert result == 'the result' 

Fondamentalmente voglio instance.labels sotto some_function ottenere il valore che voglio. Qualche suggerimento?

risposta

12

Questa versione di some_function() stampe deriso labels proprietà:

def some_function(): 
    instance = module.Foo() 
    print instance.labels 
    return instance.method() 

mio module.py:

class Foo(object): 

    labels = [5, 6, 7] 

    def method(self): 
     return 'some' 

Patching è la stessa come la tua:

with patch('module.Foo') as mock: 
    instance = mock.return_value 
    instance.method.return_value = 'the result' 
    instance.labels = [1,2,3,4,5] 
    result = some_function() 
    assert result == 'the result 

sessione della console completa:

>>> from mock import patch 
>>> import module 
>>> 
>>> def some_function(): 
...  instance = module.Foo() 
...  print instance.labels 
...  return instance.method() 
... 
>>> some_function() 
[5, 6, 7] 
'some' 
>>> 
>>> with patch('module.Foo') as mock: 
...  instance = mock.return_value 
...  instance.method.return_value = 'the result' 
...  instance.labels = [1,2,3,4,5] 
...  result = some_function() 
...  assert result == 'the result' 
...  
... 
[1, 2, 3, 4, 5] 
>>> 

Per me il codice è funzionante.

+0

Non funziona. Ho ottenuto lo stesso risultato di 'instance.labels = [1, 1, 2, 2]', che è questa variabile mocked non utilizzata da 'some_function'. Nella documentazione sta prendendo in giro il metodo anziché la variabile. – clwen

+0

Aggiornato la mia risposta. Ora mi sono perso perché il tuo codice funziona. – twil

+0

Nel mio codice, 'labels' appare solo dopo aver chiamato qualche funzione. E quella funzione è chiamata all'interno della funzione che voglio testare. Forse è questa la ragione. Finisco per deridere l'inizializzazione della classe in modo che restituisca l'oggetto finto con il comportamento che voglio. – clwen

Problemi correlati