2016-09-15 4 views
1

私はメソッドextra_get()の呼び出しを模擬しようとしています。通常はdictsのリストを返します。私がモックdocsから理解できる限り、iterableを返す場合は、side_effect paramを設定する必要があります。unittest.mock.Mock()はdictsのリストを返します

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はリストがないので、辞書のcomprehentionは失敗しますが、辞書{'foo': 'bar'}。 私は間違っていますか?どのようにして、Mockメソッドがdictsのリストを返すようにすることができますか?

+0

は[ 'side_effect'](https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.side_effect)リストを取り、あなたは別のを返すことができます(* "side_effectがiterableの場合、モックへの各呼び出しはiterableからの次の値を返します" *)。 [return_value'](https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.return_value)を使用してください。毎回返されることが1つあります。辞書のリスト。 – 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 
関連する問題