class 的模拟补丁特定实例

Mock patch specific instance of class

如何使用 patch 模拟 class 的特定实例?

在我的测试文件中有:

@classmethod
def setUpClass(cls):
    cls.instance_of_my_class = myClass()

其中一个测试然后调用 myClass 中的一个函数,我希望模拟 return 的值。

我可以这样做。

self.instance_of_my_class.cool_fuction = Mock(return_value=(True, True))

我希望使用 with patch 来做到这一点,这样模拟就不会持续到其他测试中, 以某种方式 unset 模拟。

但是,patch 需要一个像 "package.module.Class.attribute" 这样的字符串,因为它是目标,所以把

with patch("self.instance_of_my_class") as mock:
      mock.return_value.cool_fuction.return_value = (True, True)

回溯失败

AssertionError: No module named 'self'

如果我像

这样修补 class
with patch("functions_folder.my_script.myClass") as mock:
      mock.return_value.cool_fuction.return_value = (True, True)

修复了错误的实例 mock.called returns False

测试看起来像:

def test_foo_function(self):
    result = self.instance_of_my_class.foo_function()
    self.assertTrue(result[0]["confirmed"])

foo_function 调用 cool_function 我想模拟 return (True, True)

感谢@johnsharpe 指出答案。

在 Test_myClass 开始时使用与我相同的 setUpClass:

@classmethod
def setUpClass(cls):
    cls.instance_of_my_class = myClass()

工作测试用例现在看起来像:

@patch.object(myClass, "cool_function")
def test_foo_function(self, mock):
    mock.return_value = (True, True)
    
    result = self.instance_of_my_class.foo_function()

    self.assertTrue(result[0]["confirmed"])
    self.assertTrue(mock.called)