我有一个这样的程序:
class SomeClass:
_attribute = None
def __init__(self, attribute):
self._attribute = attribute
@property
def attribute(self):
print("abc")
return self._attribute
class SomeChildClass:
context: SomeClass
def __init__(self):
pass
def print_attribute(self):
print(self.context.attribute)我想统一一下print_attribute的SomeChildClass方法。因此,我想屏蔽这个类的SomeClass本身和属性属性。
当我用
def test_print_attribute(self):
with patch('app.some_class.SomeClass.attribute', new_callable=PropertyMock) as mock_attr:
mock_attr.return_value = "TEST"
some_class = SomeClass(attribute="abc")
self.child_class = SomeChildClass()
self.child_class.context = some_class
self.child_class.print_attribute()它正在工作,我得到了测试作为输出。这个解决方案的问题是需要创建一个SomeClass的实际实例。我的最终目标是这样的:
def test_print_attribute(self):
with patch('app.some_class.SomeClass.attribute', new_callable=PropertyMock) as mock_attr:
mock_attr.return_value = "TEST"
some_class = MagicMock()
self.child_class = SomeChildClass()
self.child_class.context = some_class
self.child_class.print_attribute()这里我只得到一个打印的MagicMock对象,而不是测试
<MagicMock name='mock.attribute' id='2576201109456'>我也尝试过这样做,它还返回一个MagicMock对象:
@patch('app.some_class.SomeClass')
def test_print_attribute(self, mock_some_class):
child_class = SomeChildClass()
child_class.context = mock_some_class
mock_some_class.attribute.return_value = "TEST"
child_class.print_attribute()<MagicMock name='SomeClass.attribute' id='1701032644768'>发布于 2022-10-12 09:59:55
解决方案就是不要在模拟上调用return_value方法,直接访问属性。
@patch('app.some_class.SomeClass')
def test_print_attribute(self, mock_class):
child_class = SomeChildClass()
child_class.context = mock_class
mock_class.attribute = "TEST"
child_class.print_attribute()如果有人能解释这种行为,我会接受答案:)
https://stackoverflow.com/questions/74039292
复制相似问题