2012-04-23 9 views
22
def f1(): 
    return 10, True 

def f2(): 
    num, stat = f1() 
    return 2*num, stat 

Wie kann ich Python Mock-Bibliothek verwenden f1() zu flicken und ein eigenes Ergebnis zurückgeben, damit ich f2() testen könnte?Python Mock-Patch eine Funktion innerhalb einer anderen Funktion

Bearbeitet: Ist etwas falsch mit meinem Test? Dies scheint nicht zu funktionieren, werden alle Tests nicht bestanden mit AssertionError

from foo.bar import f2 
from mock import patch 

class MyTest(TestCase): 

    def test_f2_1(self): 
     with patch('project.module.f1') as some_func: 
      some_func.return_value = (20, False) 
      num, stat = f2() 
      self.assertEqual((num, stat), (40, False)) 

    @patch('project.module.f1') 
    def test_f2_2(self, some_func): 
     some_func.return_value = (20, False) 
     num, stat = f2() 
     self.assertEqual((num, stat), (40, False)) 

Antwort

11

Das erste Beispiel schlägt vor, dass f1() und f2() im selben Modul definiert sind. Daher sollte folgendes funktionieren:

from foo.bar import f2 
from mock import patch 

class MyTest(TestCase): 

    @patch('foo.bar.f1') 
    def test_f2_2(self, some_func): 
     some_func.return_value = (20, False) 
     num, stat = f2() 
     self.assertEqual((num, stat), (40, False)) 

Flecken auf der gleichen wie Import ist: @patch('foo.bar.f1')

Hier ist eine gute Antwort auf die Frage:

http://bhfsteve.blogspot.nl/2012/06/patching-tip-using-mocks-in-python-unit.html

+1

Vielen Dank, dass Sie den Link http://bhfsteve.blogspot.nl zum Patchen und Importieren von Stilen empfohlen haben. Das hat eines meiner Probleme gelöst. – HeyWatchThis

17

Unter der Annahme, dass Sie diese mock libary verwenden:

def f1(): 
    return 10, True 

def f2(): 
    num, stat = f1() 
    return 2*num, stat 

import mock 

print f2() # Unchanged f1 -> prints (20, True) 

with mock.patch('__main__.f1') as MockClass:  # replace f1 with MockClass 
    MockClass.return_value = (30, True)  # Change the return value 

    print f2()  # f2 with changed f1 -> prints (60, True) 

Wenn Ihr Code in Module aufgeteilt würden Sie wahrscheinlich brauchen Ersetzen Sie __main__.f1 durch den Pfad zu Ihrem Modul/Funktion.

+0

Würde es einen Unterschied machen, wenn f1() akzeptiert Argumente? ZB: f1 (arg) –

+0

Die Mocking-Funktion kann mit einer beliebigen Anzahl von Argumenten aufgerufen werden, sie gibt immer den 'return_value' zurück. –

+0

Vielen Dank @Secator. Ich habe meine Frage mit einem Testfall aktualisiert und es scheint nicht zu passieren. Was mache ich falsch? –

Verwandte Themen