Мой код имеет следующую структуру:
У меня есть класс MyClass
, который наследуется от BaseClass
(это случайная точка, а не источник моей проблемы). Затем у меня есть другой класс MyClassManager
, который вызывает методы MyClass
.
. Я пишу unittest для метода MyClassManager
, и я хочу контролировать возвращаемое значение одного из методов MyClass
во время автоматического определения остальных.
В моем тесте я создал Mock для MyClass
, исправив класс с помощью autospec=True
. Затем я попытался пропатчить метод MyClass.method_to_patch
и заменить его на Substitute.substitute_method
. Пока все хорошо.
Но теперь, когда я запускаю тест, менеджер классов создает экземпляр MyClass
, который является полностью автоматически заданным Mock, но он не исправляет метод, который я хочу заменить.
Есть ли способ объединить эти два patch
декоратора для достижения того, чего я хочу?
class Substitute:
def substitute_method(self, arg1, arg2):
print("Running substitute method")
return (arg1 > 0 and arg2 > 0)
class BaseClass:
def method_to_patch(self, arg1, arg2):
return arg1 == arg2
class MyClass(BaseClass):
def myclass_method(self):
print("myclass method called")
class MyClassManager:
def method_to_test(self):
my_class = MyClass()
my_class.myclass_method()
my_class.method_to_patch(10, 100)
class TestMyClass(unittest.TestCase):
@patch.object(MyClass, "method_to_patch", Substitute.substitute_method)
@patch("__main__.MyClass", autospec=True)
def test_method_to_test(self, mock_class):
class_manager = MyClassManager()
class_manager.method_to_test()
print(mock_class.call_count)
if __name__ == "__main__":
unittest.main()