Тестовые подписи Python на макетированных объектах
Есть ли способ в CPython смоделировать объект, чтобы сигнатура смоделированного объекта все еще проверялась? Например, возьмите следующее:
MyModule.py
from OtherModule import OtherClass
class MyObject:
def MyMethod(self):
val1 = \
OtherObject.OtherMethod("Test", [1,2,3])
return val1
OtherModule.py
class OtherObject:
def OtherMethod(self):
someOtherCall(self, arg1:str, arg2:list)
#complicated function calls here
return val1
MyTest.py
import unittest
from unittest import mock
from MyModule import myObject
from OtherModule import otherObject
Class Test_myObject(unittest.testcase):
def test_myObject(self):
with patch("OtherModule.OtherClass.OtherMethod") \
as mock_OtherMethod
myObj = myObject()
actualval = \
myObject.MyMethod()
self.assertEqual(actualVal,
"my expected value")
Так что в этом примере я тестирую все и смоделирую вызов OtherObject.OtherMethod, потому что он содержит тяжелую обработку, которую я не хочу во всех моих тестах. Однако, поскольку я использовал макет, я не проверяю, будет ли подпись OtherObject.OtherMethod принимать параметры, передаваемые ему. Так что в этом случае, если, скажем, кто-то изменил подпись OtherObject.OtherMethod, требуя три аргумента, мой тест все равно будет пройден, потому что я заменил вызов на ложный. Было бы гораздо лучше, чтобы интерпретатор оценивал вызов сигнатуры в тесте, а затем заменял все другие свойства и методы объекта. Есть ли способ сделать это?