Мне не удалось найти хорошее объяснение этого в сети, я предполагаю, что упустил что-то тривиальное, но я не смог найти это, поэтому я пришел сюда, чтобы спросить экспертов :)
У меня есть тест, где мне нужно пропатчить вызов конструктора, читая документы, как я понимаю, что-то вроде этого должно работать, но:
import unittest.mock as mocker
import some_module
mock_class1 = mocker.patch('some_module.some_class')
print(mock_class1 is some_module.some_class) # Returns False
print(mock_class1) # <unittest.mock._patch>
mock_instance1 = mock_class1.return_value # _patch object has no attr return_value
Вместо этого я получаю другой вывод, если я делаю это
with mocker.patch('some_module.some_class') as mock_class2:
print(mock_class2 is some_module.some_class) # Returns True
print(mock_class2) # <MagicMock name=...>
mock_instance2 = mock_class2.return_value # No problem
print(mock_instance2) # <NonCallableMagicMock name=...>
Теперь для самого теста я использую модуль pytest-mock, который дает приспособление mocker, которое ведет себя как первый блок кода.
Я хотел бы знать:
почему поведение отличается в зависимости от того, как человек называет фиктивные рамки
есть ли чистый способ вызвать поведение второго блока кода без предложения with
?