2016-09-15 72 views
1

我试图嘲笑方法extra_get()的调用,它通常会返回一个字典列表。据我所知,从模拟docs,如果我想返回迭代,我应该设置side_effect参数。使unittest.mock.Mock()返回的字典列表

client.extra_get = mock.Mock(
      **{'side_effect': [{'foo': 'bar'}]}) 

但然后将以下代码调用模拟的方法:

extra = client.extra_get(request, type_id) 
result = {x.key: x.value for x in extra} 
return result 

而且因为extra没有列表中的字典理解中失败,但字典{'foo': 'bar'}。 我做错了什么?我怎样才能让模拟方法返回一个列表的字典?

+0

['side_effect'(https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.side_effect)取一个列表,这样你就可以返回一个不同(*“如果side_effect是可迭代的,那么每次调用模拟将返回可迭代的下一个值”*)。可以使用['return_value'](https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.return_value),每次只返回一件东西,或者提供一个词典列表清单。 – jonrsharpe

+0

@jonrsharpe最初尝试过。但是如果我使用'client.extra_get.return_value = mock.Mock(** {'return_value':[{'foo':'bar'}]})'我得到了'TypeError:'Mock'对象不可迭代'错误。 – Paul

+0

请给出一个[mcve]来证明那个问题。 – jonrsharpe

回答

2
with mock.patch.object(client, 'extra_get', return_value=[{...}, {...}]) as mock_get: 
    # fill in the rest