2013-08-06 11 views
5

私はMockを使用して特定の戻り値を持つクラスのメソッドを置き換えています。これはうまくいくかもしれませんが、あまりにもうまくいくかもしれません...私はこれを行いますが(次を参照してください)、次のテストクラスでは、パスワードクラスを再利用し、そのテストに入れられたモックはまだ有効です。Python undo method 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) 

私はこのような何かを行うことによってティアダウン方式でモックを元に戻す試みたが、それは動作しません。

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を取得しました)。 –