16

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)

こんな感じでTearDownメソッドのモックを元に戻そうとしたのですが、うまくいきません。

pass_helper._get_password_from_keyboard = pass_helper._get_password_from_keyboard

クラスメソッドの元の機能を復元するにはどうすればよいですか?

4

1 に答える 1

15

収集したように見える問題は、変更がテストの範囲に限定されず、代わりに他のテストに影響を与えることです(これはもちろん、単体テストの大きな問題です)。ティアダウン メソッドの変更を元に戻すという考えは良いものですが、問題は、これを行うときにメソッドのモック バージョンをそれ自体に再割り当てしていることです。

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)

お役に立てれば!

于 2013-08-06T15:13:20.060 に答える