2016-09-19 75 views
1

如何「重置」返回生成器的方法。如果我嘲笑這種方法,但在被測方法中使用父類兩次,第一次調用消耗生成器,第二次調用沒有數據。下面的示例代碼。對get_values的兩次調用應返回相同(模擬)列表。重置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友好,人們將不得不使用'items'而不是'iteritems'。另外,'items'也可以在Python 2中工作。所以它在兩個版本中都很友好。 – idjaw