Python mock.patch autospec 一个带有属性的类



>我有一个类,它用@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

目的:

我想以这样一种方式定义类,以便使用自动规范轻松模拟。 这就是为什么我尝试定义属性而不仅仅是在__init__中添加属性。

我想

以这样一种方式定义类,以便使用autospec轻松模拟

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

下面是一个示例:

class Base(object):

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

class 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()

最新更新