使用模拟Python返回Iterable

使用模拟Python返回Iterable,python,mocking,Python,Mocking,我正在尝试使用Mock来模拟python中的函数。这是我的密码: resp, content = request(...) request()函数需要返回两个值。以下是我尝试过的: with patch("syncdatetime.py") as sync_mock: sync_mock.request.return_value = [obj, ''] 但是当我运行测试时,我得到错误“Mock object is not iterable”。请求函数返回Moc

我正在尝试使用Mock来模拟python中的函数。这是我的密码:

    resp, content = request(...)
request()函数需要返回两个值。以下是我尝试过的:

    with patch("syncdatetime.py") as sync_mock:
        sync_mock.request.return_value = [obj, '']

但是当我运行测试时,我得到错误“Mock object is not iterable”。请求函数返回Mock类型的对象,而不是列表。如何修补请求函数以使其返回列表?

请注意,我是mock新手,因此我不是专家,但是,我刚刚遇到了同样的问题,并发现将
副作用
属性设置为返回数组的函数可以解决问题

根据示例代码,更改:

with patch("syncdatetime.py") as sync_mock:
    sync_mock.request.return_value = [obj, '']

定义

def function_returning_list(arg_list_of_choice):
    #anything you want to do goes here
    #then
    return your_list

我怀疑您的问题在于,您没有使用您认为是的mock实例。默认情况下,Mock实例在调用时返回Mock

>>> m = mock.Mock()
>>> type(m())
<class 'mock.mock.Mock'>    
您不需要使用
副作用
返回列表。分配
返回值
应该有效

>>> m = mock.Mock()
>>> m.return_value = ['a', 'b']
>>> (a, b) = m()
>>> a
'a'
>>> b
'b'

我没有尝试过这个,但我确实找到了一个更简单的解决方案。与其修补模块,不如修补函数本身,然后设置patch.return\u值。老实说,我不完全确定为什么会这样,但这样,函数就不会返回模拟对象。不过,谢谢你的回复。
>>> m = mock.Mock()
>>> (a, b) = m()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Mock' object is not iterable
>>> m = mock.Mock()
>>> m.return_value = ['a', 'b']
>>> (a, b) = m()
>>> a
'a'
>>> b
'b'