2013-07-18 5 views
9

Używam biblioteki Python mock. Wiem jak mock metodę instancji klasy postępując zgodnie z document:Python mock instancja klasy zmiennej

>>> 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' 

jednak próbował szydzić zmienną instancji klasy, ale nie działa (instance.labels w poniższym przykładzie):

>>> 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' 

Zasadniczo chcę instance.labels pod some_function uzyskać żądaną wartość. Jakieś wskazówki?

Odpowiedz

12

Ta wersja some_function() wydruków szydzili labels właściwość:

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

My module.py:

class Foo(object): 

    labels = [5, 6, 7] 

    def method(self): 
     return 'some' 

Łatanie jest takie same:

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 

Pełna sesja konsoli:

>>> 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] 
>>> 

Dla mnie Twój kod to działa.

+0

To nie działa. Otrzymałem taki sam wynik jak 'instance.labels = [1, 1, 2, 2]', która jest tą wyśmiewaną zmienną, która nie została użyta przez 'some_function'. W dokumentacji jest to metoda szydercza zamiast zmiennej. – clwen

+0

Zaktualizowałem moją odpowiedź. Teraz jestem zagubiony, ponieważ twój kod działa. – twil

+0

W moim kodzie "etykiety" pojawiają się dopiero po wywołaniu jakiejś funkcji. Ta funkcja jest wywoływana w ramach funkcji, którą chcę przetestować. Może to jest powód. Kończę się wyśmiewać inicjalizacji klasy, aby zwrócić obiekt fałszywy z zachowaniem, które chcę. – clwen