2013-08-06 11 views
5

Ich benutze Mock, um Methode von einer Klasse mit einem bestimmten Rückgabewert zu ersetzen. Es funktioniert sehr gut, vielleicht ein wenig zu gut ... Ich mache das (siehe unten), aber in der nächsten Testklasse benutze ich die Passwortklasse ohne zu verspotten, und der in diesem Test platzierte Schein ist immer noch wirksam.Python undo Methode 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) 

Ich versuchte, die Mock in der TearDown Methode rückgängig gemacht durch so etwas wie dies zu tun, aber es funktioniert nicht.

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

Wie kann ich die ursprüngliche Funktion der Klassenmethode wiederherstellen?

Antwort

3

Das Problem, so wie es aussieht, besteht darin, dass die vorgenommenen Änderungen nicht auf den Testumfang beschränkt sind, sondern in andere Tests münden (was natürlich ein großes Problem beim Komponententest ist). . Ihre Idee, die Änderung in Ihrem Teardown Verfahren Umkehren ist gut, aber das Problem ist, dass Sie die Neuzuweisung der Mock Version des Verfahrens an sich selbst zurück, wenn Sie dies tun:

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

So etwas sollte Arbeiten, wo vor der Methode spöttischen Sie die ‚echte‘ Version des Verfahrens zu einer temporären variablen zuweisen:

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) 

hoffe, das hilft!

+0

Scheint mein Problem zu beheben, danke! :) – Amaranth

+0

nachdem ich dies getan habe, bekomme ich 'ungebundene Methode xxx muss aufgerufen werden mit xxx-Instanz als das erste Argument (Got Int stattdessen)' –