Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python模拟返回getattr()调用_Python_Unit Testing_Mocking - Fatal编程技术网

Python模拟返回getattr()调用

Python模拟返回getattr()调用,python,unit-testing,mocking,Python,Unit Testing,Mocking,编辑:我可能掉进了XY问题陷阱。这是我真正想要的 我有以下功能: 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 patche

编辑:我可能掉进了XY问题陷阱。这是我真正想要的

我有以下功能:

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())
现在我要做的是将
预期返回值
提供到
对象上的
某些属性上

我已尝试使用PropertyMock:

type(mocked_bar).getattr = PropertyMock(return_value=expected_return_value)
运行我的测试时,我得到错误:

TypeError: 'list' object is not callable
如果
return\u值
设置为标量(不是列表),则实函数中的
getattr
调用的结果是模拟的,而不是我提供的标量


此外,我还担心模拟出
getattr
方法,因为这是一种常见的方法,可能会在函数的其他地方使用。如何在测试中的mock对象的属性上设置列表?

根据文档,mock的返回值是不可编辑的。要获得可计算的返回值,请使用副作用

mocked_bar = MagicMock()
mocked_bar.side_effect = [obj1, obj2, ...]

编辑:文档位于

具体而言:


副作用:在调用Mock时调用的函数。请参见“副作用”属性。用于引发异常或动态更改返回值。使用与模拟相同的参数调用该函数,除非它返回默认值,否则此函数的返回值将用作返回值。

我没有完全遵循,但我认为您需要
getattr(条形,“some_attr”,None)
,因为
getattr
是一个内置全局函数,不是所有东西都有的方法。@AlexHall,使用该方法签名,我最终得到了我的MagicMock对象,而不是我所期望的列表。但是这是朝着正确的方向迈出的一步。你能添加一个到文档的链接吗?@Danny_DD-添加。使用
副作用
意味着
[mocked_bar(),mocked_bar(),…]=[obj1,obj2]
,而不是
mocked_bar()=[obj1,obj2,…]
。每次调用,你都会得到副作用中的下一项。--第一个模拟的_-bar()==obj1---第二个模拟的_-bar()==obj2