2013-08-06 52 views
5

我正在使用模擬從具有特定返回值的類中替換方法。它工作的很好,也許有點太好......我這樣做(見下文),但在下一個測試課程中,我重複使用密碼類而不嘲笑,放在該測試中的模擬仍然有效。Python取消方法模擬

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) 

我試着通過做這樣的事情來取消TearDown方法中的模擬,但它不起作用。

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

如何恢復類方法的原始功能?

回答

3

問題,因爲它看起來像你已經收集的,是你所做的改變並不侷限於測試的範圍,而是流入其他測試(當然這是單元測試時的一個大問題) 。你扭轉你的拆卸方法變化的想法是好的,但問題是,你正在重新分配方法的模擬版本回到自身,當你做到這一點:

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard 

像這樣的東西應該工作,在那裏你嘲笑的方法的「真實」版本分配給一個臨時變量的方法之前:

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) 

希望這有助於!

+0

似乎要解決我的問題,謝謝! :) – Amaranth

+0

我這樣做後,我得到'unbound方法xxx必須用xxx實例作爲第一個參數調用(代替int)' –