python - 如何使用 mock.patch 模拟生成器

标签 python generator nose python-unittest python-mock

我已经浏览了页面 https://docs.python.org/3/library/unittest.mock-examples.html我看到他们列出了一个关于如何模拟生成器的例子

我有一个代码,我调用生成器给我一组值,我将这些值保存为字典。我想在我的单元测试中模拟对该生成器的调用。

我已经写了下面的代码,但它不起作用。

我哪里错了?

In [7]: items = [(1,'a'),(2,'a'),(3,'a')]

In [18]: def f():
    print "here"
    for i in [1,2,3]:
        yield i,'a'

In [8]: def call_f():
   ...:     my_dict = dict(f())
   ...:     print my_dict[1]
   ...: 

In [9]: call_f()
"here"
a

In [10]: import mock


In [18]: def test_call_f():
    with mock.patch('__main__.f') as mock_f:
        mock_f.iter.return_value = items
        call_f()
   ....: 

In [19]: test_call_f()
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-19-33ca65a4f3eb> in <module>()
----> 1 test_call_f()

<ipython-input-18-92ff5f1363c8> in test_call_f()
      2     with mock.patch('__main__.f') as mock_f:
      3         mock_f.iter.return_value = items
----> 4         call_f()

<ipython-input-8-a5cff08ebf69> in call_f()
      1 def call_f():
      2     my_dict = dict(f())
----> 3     print my_dict[1]

KeyError: 1

最佳答案

改变这一行:

mock_f.iter.return_value = items

对此:

mock_f.return_value = iter(items)

关于python - 如何使用 mock.patch 模拟生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36165929/

相关文章:

python - 当未请求插件时,nosetests 为 AnswerTesting 发出运行时警告

android - 继续获取 "Program python is not found in PATH"

python - Keras 的 `model.fit_generator()` 行为不同于 `model.fit()`

python - 用补丁模拟两个函数以进行单元测试

MySQL 为依赖表生成 sql 插入

javascript - 当我给他一个负数和一个正数时,为什么我的 JS 随机整数生成器如此错误?

python - 测试覆盖 Nose vs pytest

python - 使用python从xml数据中提取所有文本

python - 我需要编写一个Python代码来接受用户的数字并将其转换为二进制而不使用函数或bin?

python - 如何修复读取列 MultiIndex 标题行缺少值的 CSV?