我正在尝试使用Mock来模拟python中的函数。这是我的代码:
resp, content = request(...)
request()函数需要返回两个值。这是我试过的:
with patch("syncdatetime.py") as sync_mock:
sync_mock.request.return_value = [obj, '']
但是当我运行测试时,我得到错误“模拟对象不可迭代”。请求函数返回Mock类型的对象而不是列表。如何修改请求函数以便返回列表?
答案 0 :(得分:12)
我怀疑你的问题是你没有使用你认为自己的模拟实例。默认情况下,Mock实例在调用时返回Mock。
>>> m = mock.Mock()
>>> type(m())
<class 'mock.mock.Mock'>
看起来您对request
的调用正在返回模拟,因为return_value
尚未初始化,这意味着resp, content = request()
正在尝试解压缩Mock对象。
>>> m = mock.Mock()
>>> (a, b) = m()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'Mock' object is not iterable
您不需要使用side_effect
来返回列表。分配return_value
应该有效。
>>> m = mock.Mock()
>>> m.return_value = ['a', 'b']
>>> (a, b) = m()
>>> a
'a'
>>> b
'b'
答案 1 :(得分:8)
请注意披露,我是新来的模拟,所以我不是专家,但是,我刚遇到同样的问题,并发现将side_effect
属性设置为返回数组的函数修复了一些事情
从示例代码中,更改:
with patch("syncdatetime.py") as sync_mock:
sync_mock.request.return_value = [obj, '']
到
with patch("syncdatetime.py") as sync_mock:
sync_mock.request.side_effect = function_returning_list
并定义
def function_returning_list(arg_list_of_choice):
#anything you want to do goes here
#then
return your_list