gpt4 book ai didi

Python mock.patch autospec 具有属性的类

转载 作者:太空宇宙 更新时间:2023-11-03 11:39:51 29 4
gpt4 key购买 nike

我有一个类,它使用@property 装饰器定义了一些属性。当我修补该类并设置 autospec=True 时,我希望该属性的行为符合规范

class MyClass(object):

def __init__(self):
self.will_not_be_mocked = 'not mocked'

@property
def will_be_mocked(self):
return 'mocked property'

预期行为:

当我访问实例上的 will_be_mocked 属性时,它的行为类似于字符串属性。

>>> my_obj = MyClass()
>>> my_obj.will_be_mocked
'mocked property'

不可调用

>>> my_obj.will_be_mocked()
TypeError: 'str' object is not callable

所以这个测试应该通过:

with self.assertRaises(TypeError):
my_obj.will_be_mocked()

观察到的行为:

当我修补该类并设置 autospec=True 时,该属性按预期包含在模拟的规范中,但是,它变成了 MagicMock,并且可以调用。因此任何试图执行该属性的代码都可能通过单元测试并在生产中失败

@patch('__main__.MyClass', autospec=True)
def test_MyClass(self, MyClass):
my_obj = MyClass()
with self.assertRaises(TypeError):
my_obj.will_be_mocked()

AssertionError: TypeError not raised

目标:

我想以易于使用 autospec 模拟的方式定义类。这就是为什么我试图定义属性而不是仅仅在 __init__ 中添加属性。

最佳答案

I want to define the class in such a way that it is easy to mock with autospec

autospec 通常用于模拟或伪造类的所有内容的情况。在您的示例中并非如此,修补或伪造 1 并且只需要一个类属性。

这是一个例子:

类基础(对象):

@property
def cls_property(self):
return 'cls_property'

类 TestBase(unittest.TestCase):

def test_cls_property_with_property(self):
"""
"""
with mock.patch('app.Base.cls_property', new_callable=mock.PropertyMock) as mock_cls_property:
mock_cls_property.return_value = 'mocked_cls_property'
base = Base()
self.assertEqual(base.cls_property, 'mocked_cls_property')

with self.assertRaises(Exception):
base.cls_property()

关于Python mock.patch autospec 具有属性的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51771183/

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