对模拟对象的Python测试签名

时间:2018-07-17 00:12:59

标签: python unit-testing mocking magicmock

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

0 个答案:

没有答案