重置python模拟生成器返回值

时间:2016-09-19 13:33:25

标签: python mocking

我怎样才能重置"返回生成器的方法。如果我模拟此方法但在测试方法中使用父类两次,则第一次调用使用生成器,第二次调用没有数据。示例代码如下。对get_values的两次调用应该返回相同的(模拟的)列表。

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')]
[]

1 个答案:

答案 0 :(得分: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的返回值是调用的结果。