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的签名更改为需要三个arg,则我的测试仍会通过,因为我已用模拟替换了调用。最好让解释器在测试中评估签名调用,然后替换对象的所有其他属性和方法。有办法吗?