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 回答