python - 重置 python 模拟生成器返回值

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

最佳答案

这个怎么样?

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的返回值就是调用的结果。

关于python - 重置 python 模拟生成器返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39574537/

相关文章:

c++ - 是否可以模拟或重载对 Boost::Filesystem(.hpp) 的直接引用?

perl - 用于 Perl 单元测试的模拟文件系统

go - 如何正确模拟导入的库?

python - 使用递归替换 goto

python - 切片 numpy 数组时出现意外的形状

Python for 循环?

java - EasyMock "expected"调用次数大于 "times"方法中设置的值

vue.js - 开 Jest 测试正在从 Vue 观察器调用函数

用于 postgresql pg_dump* 的 python api,恢复命令

Python的unittest,通过输入通过测试