2013-08-06 76 views
5

Yöntemi belirli bir dönüş değeri olan bir sınıftan değiştirmek için Mock kullanıyorum. Çok iyi çalışıyor, belki biraz fazla iyi ... Bunu yapıyorum (aşağıya bakın), ama bir sonraki test sınıfında parola sınıfını alay etmeden tekrar kullanıyorum ve bu testte yer alan sahte hala etkili. Python geri alma yöntemi alay

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) 

Böyle bir şey yaparak söküm yönteminde mock geri almayı denedim ama çalışmıyor.

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

Sınıf yönteminin özgün işlevini nasıl geri yükleyebilirim?

cevap

3

Sorun, topladığınız gibi, yaptığınız değişikliklerin sınama kapsamı ile sınırlı olmadığı, bunun yerine başka sınamalara (yani, birim sınaması yapılırken büyük bir sorun olan) sızmasıdır. .

böyle
pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

şey yapmalıdır: senin söküm yönteminde değişiklik tersine senin fikrin ancak sorun kendisine geri yöntemin sahte sürümünü yeniden atama olduğunu bunu yaparken olduğu, iyi bir tanesidir iş, nerede geçici bir değişkene yöntemin 'gerçek' versiyonu atamak yöntemi alay önce: Bu yardımcı olur

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) 

Umut!

+0

Sorunumu gidermekte görünüyor, teşekkürler! :) – Amaranth

+0

bunu yaptıktan sonra, 'unbound method xxx ilk argüman olarak xxx örneğiyle çağrılmalıdır (int var yerine)' –