gpt4 book ai didi

python - 你如何模拟一个 python 类并为每个实例化获取一个新的 Mock 对象?

转载 作者:IT老高 更新时间:2023-10-28 22:22:24 31 4
gpt4 key购买 nike

好的,
我知道 manual 中提到了这一点,并且可能与 side_effect 和/或 return_value 有关,但一个简单直接的示例将极大地帮助我。

我有:

class ClassToPatch():
def __init__(self, *args):
_do_some_init_stuff()

def some_func():
_do_stuff()


class UUT():
def __init__(self, *args)
resource_1 = ClassToPatch()
resource_2 = ClassToPatch()

现在,我想对 UUT 类进行单元测试,并模拟 ClassToPatch。知道 UUT 类将恰好实例化两个 ClassToPatch 对象,我希望 Mock 框架为每个实例化返回一个新的 Mock 对象,这样我以后就可以分别断言对每个对象的调用。

如何在测试用例中使用 @patch 装饰器来实现这一点?即如何修复以下代码示例?

class TestCase1(unittest.TestCase):

@patch('classToPatch.ClassToPatch',autospec=True)
def test_1(self,mock1,mock2):
_assert_stuff()

最佳答案

这里有一个快速的'n'dirty示例让你开始:

import mock
import unittest

class ClassToPatch():
def __init__(self, *args):
pass

def some_func(self):
return id(self)

class UUT():
def __init__(self, *args):
resource_1 = ClassToPatch()
resource_2 = ClassToPatch()
self.test_property = (resource_1.some_func(), resource_2.some_func())

class TestCase1(unittest.TestCase):
@mock.patch('__main__.ClassToPatch', autospec = True)
def test_1(self, mock1):
ctpMocks = [mock.Mock(), mock.Mock()]
ctpMocks[0].some_func.return_value = "funky"
ctpMocks[1].some_func.return_value = "monkey"
mock1.side_effect = ctpMocks

u = UUT()
self.assertEqual(u.test_property, ("funky", "monkey"))

if __name__ == '__main__':
unittest.main()

我已将 test_property 添加到 UUT,以便单元测试做一些有用的事情。现在,没有模拟 test_property 应该是一个包含两个 ClassToPatch 实例的 id 的元组。但是对于模拟,它应该是元组:("funky", "monkey").

我用过 side_effect模拟对象的属性,以便在 UUT 初始化程序中的每次调用时返回一个不同的 ClassToPatch 实例。

希望这会有所帮助。

编辑:哦,顺便说一句,当我运行单元测试时,我得到:

.
----------------------------------------------------------------------
Ran 1 test in 0.004s

OK

关于python - 你如何模拟一个 python 类并为每个实例化获取一个新的 Mock 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10750996/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com