2016-09-19 4 views
1

Как я могу «сбросить» метод, возвращающий генератор. Если я высмеиваю этот метод, но дважды использую родительский класс в тестируемом методе, первый вызов потребляет генератор, а второй вызов не имеет данных. Пример кода ниже. Два вызова get_values ​​должны возвращать тот же (издевавшийся) список.Сбросить возвращаемое значение генератора mock генератора 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')] 

Actual:

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

ответ

2

Как это?

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

Побочный эффект происходит каждый раз, каждый раз воссоздает каждый раз.

Вы можете даже установить Dict перед тем, как так

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

Возвращаемое значение side_effect является результатом вызова.

+0

спасибо! – jqwha

+0

Просто хотел заметить, что для того, чтобы этот Python 3 был дружелюбным, нужно было бы использовать 'items' вместо' iteritems'. Кроме того, 'элементы' будут работать и в Python 2. Таким образом, он делает его дружественным в обеих версиях. – idjaw

Смежные вопросы