【发布时间】:2016-04-21 22:22:18
【问题描述】:
编辑:我可能会陷入 XY 问题陷阱。这就是我真正想要的know。
我有以下功能:
def foo():
bar = funcToGetBar()
return bar.getattr("some_attr", None)
在我的测试中,我尝试这样做:
mocked_bar = MagicMock()
expected_return_val = [obj1, obj2, ...]
funcToGetBar.return_value = mocked_bar # funcToGetBar is patched
def testGetBar(self):
assertEqual(expected_return_val, foo())
现在我要做的是将expected_return_val 提供给bar 对象的some_attr 属性。
我尝试过使用 PropertyMock:
type(mocked_bar).getattr = PropertyMock(return_value=expected_return_value)
运行我的测试我得到了错误:
TypeError: 'list' object is not callable
如果return_value 设置为标量(不是列表),则实际函数中getattr 调用的结果是模拟,而不是我提供的标量。
另外,我担心会模拟出getattr 方法,因为它是一种常见的方法,可能会在我的函数的其他地方使用。如何在被测模拟对象的属性上设置列表?
【问题讨论】:
-
我没有关注所有内容,但我认为您想要
getattr(bar, "some_attr", None),因为gettattr是内置的全局函数,而不是所有内容都有的方法。 -
@AlexHall,使用该方法签名我最终得到了我的 MagicMock 对象,而不是我期望的列表。但这是朝着正确方向迈出的一步。
标签: python unit-testing mocking