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

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

Come si usa biblioteca finta di pitone per rattoppare f1() e restituire un risultato personalizzato in modo ho potuto testare f2()?Python cerotto finto una funzione all'interno di un'altra funzione

Modificato: C'è qualcosa che non va nel mio test? Questo non sembra funzionare, tutti i test non sono riusciti con 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)) 

risposta

11

Il primo esempio suggerisce che f1() e f2() definiti nello stesso modulo. Da qui la seguente dovrebbe funzionare:

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

Patch è lo stesso di importazione: @patch('foo.bar.f1')

Ecco una buona risposta sul tema:

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

+1

Grazie per aver consigliato il collegamento http://bhfsteve.blogspot.nl relativo alle patch e agli stili di importazione. Questo ha risolto uno dei miei problemi. – HeyWatchThis

17

Supponendo che si sta utilizzando questo mock libary:

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) 

Se il codice è suddiviso in moduli che si sarebbe probabilmente bisogno di per sostituire __main__.f1 con il percorso del modulo/funzione.

+0

farebbe alcuna differenza se f1() accetta argomenti? E.g: f1 (arg) –

+0

La funzione di mocking può essere chiamata con qualsiasi numero di argomenti, restituirà sempre il valore 'return_value'. –

+0

Grazie mille @Secator. Ho aggiornato la mia domanda con un caso di test e non sembra passare. Che cosa sto facendo di sbagliato? –

Problemi correlati