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)
Надеюсь это поможет!