2016-09-19 20 views
1

ジェネレータを返すメソッドを "リセット"する方法を教えてください。このメソッドを模倣し、テスト中のメソッドで親クラスを2回使用すると、最初の呼び出しはジェネレータを消費し、2番目の呼び出しはデータを持ちません。以下のサンプルコード。 get_valuesへの2回の呼び出しは、同じ(模擬された)リストを返さなければなりません。pythonモックジェネレータの戻り値をリセットする

import mock 

class MyTestClass(object): 
    def __init__(self, param): 
     self.param = param 

    def get_values(self): 
     return self.param 


class MyTestRunner(object): 
    def __init__(self): 
     pass 

    def run(self): 
     cls = MyTestClass(2) 
     print list(cls.get_values()) 
     cls = MyTestClass(3) 
     print list(cls.get_values()) 


with mock.patch.object(MyTestClass, 'get_values') as mock_class: 
    mock_class.return_value = ({'a': '10', 'b': '20'}).iteritems() 
    m = MyTestRunner() 
    m.run() 

は予想:

[('a', '10'), ('b', '20')] 
[('a', '10'), ('b', '20')] 

実際:

[('a', '10'), ('b', '20')] 
[] 

答えて

2

このうどのように?

mock_class.side_effect = lambda x: {'a': '10', 'b': '20'}.iteritems() 

すべての呼び出しで副作用が発生するため、毎回再作成されます。

のようなので、

my_dict = {'a': '10', 'b': '20'} 
mock_class.side_effect = lambda x: my_dict.iteritems() 

side_effectの戻り値が呼び出しの結果である前に、あなたも、辞書を設定することができます。

+0

ありがとうございました! – jqwha

+0

このPython 3を使いやすくするためには、iteritemsの代わりに 'items'を使わなければならないことに注意してください。また、 'items'もPython 2で動作します。それで、両方のバージョンで使いやすいものになっています。 – idjaw

関連する問題