Python отменить метод макет

Я использую 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

Как я могу восстановить исходную функциональность метода класса?

1 ответ

Решение

Проблема, как вы, похоже, поняли, состоит в том, что сделанные вами изменения не ограничиваются рамками теста, а вместо этого попадают в другие тесты (что, конечно, является большой проблемой при модульном тестировании). Ваша идея отменить изменение в вашем методе разрыва является хорошей, однако проблема заключается в том, что вы повторно назначаете макетную версию метода себе, когда вы делаете это:

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)

Надеюсь это поможет!

Другие вопросы по тегам