2013-04-01 6 views
11

Ich benutze Mock (http://www.voidspace.org.uk/python/mock/mock.html), und stieß auf einen bestimmten Mockfall, dass ich kann nicht herausfinden, die Lösung.UnitTest Python Schein nur eine Funktion mehrere Anruf

Ich habe eine Funktion mit mehreren Aufrufen zu some_function, die Mocked ist.

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

Ich möchte nur den ersten und dritten Aufruf von some_function verspotten. Der zweite Anruf möchte ich zu der echten some_function gemacht werden. Ich habe einige Alternativen mit http://www.voidspace.org.uk/python/mock/mock.html#mock.Mock.mock_calls versucht, aber ohne Erfolg.

Vielen Dank im Voraus für die Hilfe.

Antwort

17

Es scheint, dass das wraps Argument könnte sein, was Sie wollen:

Wraps: Item für das Mock-Objekt zu wickeln. Wenn Wraps nicht None ist, dann ruft der Aufruf Mock den Aufruf an das umgebrochene Objekt weiter (das echte Ergebnis zurückgegeben und Rückgabewert ignoriert).

Da jedoch nur der zweite Aufruf nicht verspottet werden soll, würde ich die Verwendung von mock.side_effect vorschlagen.

Wenn side_effect eine iterable ist dann jeder Aufruf des Mock wird den nächsten Wert aus dem iterable zurückzukehren.

Wenn Sie einen anderen Wert für jeden Anruf zurückkehren wollen, ist es eine perfekte Passform:

somefunction_mock.side_effect = [10, None, 10] 

Nur die ersten und dritten Anrufe somefunction 10.

jedoch zurück, wenn Sie müssen die echte Funktion aufrufen, aber nicht das zweite Mal, können Sie auch side_effect eine aufrufbar übergeben, aber ich finde es ziemlich hässlich (es könnte ein schlauer es tun):

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 
Verwandte Themen