2013-04-01 11 views
11

Używam Mock (http://www.voidspace.org.uk/python/mock/mock.html), i natknąłem się na konkretny przypadek próbny, że nie mogę znaleźć rozwiązania.UnitTest Python fałszywa tylko jedna funkcja wielokrotnego wywołania

Mam funkcję z wieloma połączeniami do funkcji, która jest wyśmiewana.

def function(): 
    some_function(1) 
    some_function(2) 
    some_function(3) 

Chcę tylko przedrzeźniać pierwsze i trzecie połączenie do jakiejś funkcji. Drugie wołanie, które chcę zrobić, aby uzyskać prawdziwą funkcję.

Próbowałem alternatyw z http://www.voidspace.org.uk/python/mock/mock.html#mock.Mock.mock_calls, ale bez powodzenia.

Z góry dziękujemy za pomoc.

Odpowiedz

17

Wydaje się, że wraps argumentem może być to, co chcesz:

okłady: Wyszczególnienie za atrapa obiektu zawinąć. Jeśli wraps nie ma wartości None, wywołanie funkcji Mock spowoduje przekazanie wywołania do owiniętego obiektu (zwrócenie rzeczywistego wyniku i zignorowanie wartości zwracanej).

Ponieważ jednak chcemy, aby drugie połączenie nie było kpiną, sugerowałbym użycie numeru mock.side_effect.

Jeśli side_effect jest iterable wtedy każde wywołanie do mock powróci kolejną wartość z iterable.

Jeśli chcesz powrócić inną wartość dla każdego wywołania, to idealne dopasowanie:

somefunction_mock.side_effect = [10, None, 10] 

Tylko pierwsze i trzecie wywołania somefunction powróci 10.

Jednakże, jeśli trzeba zadzwonić do funkcji rzeczywistej, ale nie po raz drugi, można również przekazać side_effect do wywołania, ale uważam, że jest dość brzydka (może być mądrzejszy to zrobić):

class CustomMock(object): 

    calls = 0 

    def some_function(self, arg): 
     calls = calls + 1 
     if calls != 2: 
      return my_real_function(arg) 
     else: 
      return DEFAULT 

somefunction_mock.side_effect = CustomMock().some_function 
Powiązane problemy