2013-08-06 14 views
5

Sto usando Mock per sostituire il metodo da una classe con uno specifico valore di ritorno. Funziona molto bene, forse un po 'troppo bene ... Faccio questo (vedi sotto), ma nella prossima classe di test, riuso la classe della password senza fare il mocking, e il simulato inserito in quel test è ancora efficace.Python Annulla metodo mock

from utils import password as pass_helper 

class TestPassword(unittest.TestCase): 
    def setUp(self): 
     self.username = "user" 
     self.password = "Test_1234_pass" 
     pass_helper._get_password_from_keyboard = Mock(return_value=self.password) 

    def test_password(self): 
     password = pass_helper._get_password_from_keyboard(self.username) 
     self.assertEqual(password, self.password) 

ho provato disfare il mock nel metodo tearDown facendo qualcosa di simile, ma non funziona.

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

Come è possibile ripristinare la funzionalità originale del metodo di classe?

risposta

3

Il problema, come sembra averlo raccolto, è che le modifiche apportate non sono limitate allo scopo del test, ma si trasformano invece in altri test (che è ovviamente un grosso problema durante il test dell'unità) . La tua idea di invertire il cambiamento nel metodo teardown è una buona, ma il problema è che si sta ri-assegna la versione finta del metodo a se stesso quando si esegue questa operazione:

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

Qualcosa del genere dovrebbe lavoro, dove prima beffardo il metodo si assegna la versione 'reale' del metodo a una variabile temporanea:

def setUp(self): 
    self.username = "user" 
    self.password = "Test_1234_pass" 
    self.real_get_password_from_keyboard = pass_helper._get_password_from_keyboard 
    pass_helper._get_password_from_keyboard = Mock(return_value=self.password) 

def tearDown(self): 
    pass_helper._get_password_from_keyboard = self.real_get_password_from_keyboard 

def test_password(self): 
    password = pass_helper._get_password_from_keyboard(self.username) 
    self.assertEqual(password, self.password) 

Spero che questo aiuti!

+0

Sembra che il problema sia risolto, grazie! :) – Amaranth

+0

dopo averlo fatto, ottengo che 'il metodo unbound xxx deve essere chiamato con l'istanza xxx come primo argomento (ottenuto invece int)' –