Python模拟Iterable(有点)不工作

Python模拟Iterable(有点)不工作,python,python-mock,Python,Python Mock,我正在为Flask应用程序创建一个测试模块。在这个Resource的get()方法中,我从Mongo获取数据,然后遍历它以生成输出。我正在模拟集合的find()方法以返回我的iterable。问题是在我循环遍历iterable的get()中,它会跳过,就好像它是空的一样。因此,我尝试在测试中循环iterable,我可以成功地看到它应该包含的3个dict 类别属性: class _TestAll(BaseAllReports): collection = MagicMock() b

我正在为Flask应用程序创建一个测试模块。在这个
Resource
的get()方法中,我从Mongo获取数据,然后遍历它以生成输出。我正在模拟集合的
find()
方法以返回我的iterable。问题是在我循环遍历iterable的
get()
中,它会跳过,就好像它是空的一样。因此,我尝试在测试中循环iterable,我可以成功地看到它应该包含的3个dict

类别属性:

class _TestAll(BaseAllReports):
    collection = MagicMock()
    bool_columns = ('bool1', 'bool2')
    string_set_columns = ('string1', 'string2')
    int_columns = ('int1', 'int2')
    text_columns = ('text1', 'text2')
    stats_columns = ('bool1', 'int1')
Resource.get():

测试设置:

@classmethod
def setUpClass(cls):
    app.testing = True
    cls.app = app.test_client()
    cls.url = '/incidents'
    cls.url_with_key = '/incidents?key=testKeyHash'
    api.add_resource(_TestAll, cls.url)
测试:

终端输出:

<MagicMock name='find()' id='4423760080'>
('test', {'timestamp': datetime.datetime(2017, 5, 25, 13, 3, 9, 255912), 'text2': 'test', 'text1': 'test', 'int1': 1, 'int2': 2, 'id': 0, 'bool1': True, 'bool2': False, 'total_hurt': 1, 'total_dead': 0, 'string2': 'test', 'string1': 'test'})
('test', {'timestamp': datetime.datetime(2017, 5, 25, 13, 3, 9, 255923), 'text2': 'test', 'text1': 'test', 'int1': 1, 'int2': 2, 'id': 1, 'bool1': True, 'bool2': False, 'total_hurt': 1, 'total_dead': 0, 'string2': 'test', 'string1': 'test'})
('test', {'timestamp': datetime.datetime(2017, 5, 25, 13, 3, 9, 255928), 'text2': 'test', 'text1': 'test', 'int1': 1, 'int2': 2, 'id': 2, 'bool1': True, 'bool2': False, 'total_hurt': 1, 'total_dead': 0, 'string2': 'test', 'string1': 'test'})
{u'stats': {u'bool1': {}, u'int1': {}, u'month': {}}, u'involved': 3, u'dead': 0, u'hurt': 0, u'incidents': 0, u'affected': 0}

('test',{'timestamp':datetime.datetime(2017,5,25,13,3,9255912),'text2':'test','text1':'test','int1','int2':2,'id':0,'bool1':True,'bool2':False,'total_hurt':1,'total_dead':0,'string2':'test','string1':'test})
('test',{'timestamp':datetime.datetime(2017,5,25,13,3,9255923),'text2':'test','text1':'test','int1','int2':2,'id':1,'bool1':True,'bool2':False,'total_hurt':1,'total_dead':0,'string2':'test','string1':'test'))
('test',{'timestamp':datetime.datetime(2017,5,25,13,3,9255928),'text2':'test','text1':'test','int1','int2':2,'id':2,'bool1':True,'bool2':False,'total_hurt':1,'total_dead':0,'string2':'test','string1':'test'))
{u'stats':{u'bool1':{},u'int1':{},u'month':{},u'included':3,u'dead':0,u'hurt':0,u'events':0,u'impact':0}
我不明白为什么资源不能正确地循环通过iterable,但是测试不能。感谢您的帮助


谢谢

当设置
\uuuu iter\uuuu
值时,该行是

search.__iter__.return_value = answer
我没有考虑到
filter()
是可调用的。实现我所尝试的目标的正确方法是:

search.return_value.__iter__.return_value = answer
因为调用了
search
Mock,所以返回了一个新的
MagicMock
,它显然没有设置
\uuuuuu iter\uuuu
属性。reource的
get()
和测试函数正在访问不同的mock,这就是为什么它只在其中一个mock上工作


我发现的方法是在测试方法内部打印模拟,并为其获取不同的模拟id。

当设置
\uuuu iter\uuu
值时,行是

search.__iter__.return_value = answer
我没有考虑到
filter()
是可调用的。实现我所尝试的目标的正确方法是:

search.return_value.__iter__.return_value = answer
因为调用了
search
Mock,所以返回了一个新的
MagicMock
,它显然没有设置
\uuuuuu iter\uuuu
属性。reource的
get()
和测试函数正在访问不同的mock,这就是为什么它只在其中一个mock上工作


我发现的方法是在测试方法内部打印模拟,并为其获取不同的模拟id。

我不理解您的问题。我无法重现您的问题:
x=MagicMock();x、 返回值=[1]
对我来说效果很好:
在x中为y:print(y)
产生
1
。请:提供一个完整的例子,我们可以用来重现您的问题。在这两者之间可能还有其他东西在制造麻烦…@Bakuriu我添加了类和设置方法。我有其他测试,但我已经注释掉了它们,问题仍然存在,因此不需要这些测试。我没有传递参数,所以search_doc()返回一个空的dict。您认为还有什么相关的吗?我不理解您的问题。我无法重现您的问题:
x=MagicMock();x、 返回值=[1]
对我来说效果很好:
在x中为y:print(y)
产生
1
。请:提供一个完整的例子,我们可以用来重现您的问题。在这两者之间可能还有其他东西在制造麻烦…@Bakuriu我添加了类和设置方法。我有其他测试,但我已经注释掉了它们,问题仍然存在,因此不需要这些测试。我没有传递参数,所以search_doc()返回一个空的dict。您认为还有什么是相关的?