python - 在 Python 中测试生成器

标签 python unit-testing python-3.x generator

我用 Python 3.4 编写了一个非常简单的生成器:

class Gen:
  def __init__(self, xml_lines, attribs):
    #...

  def _get_values(self, xml_line):
    # get only specific "attribs" from a line in a "xml"

  def values(self):
    for line in self.xml_lines:
      yield self._get_values(line)

当我使用 for 循环使用生成的值时,代码有效:

reader = Gen(...):
for v in reader.values():
   print(v)

但我现在正在尝试创建一个单元测试,为此,我需要一次获取每个值(在循环之外)。我正在尝试这样的事情:

import unittest
#...
reader = Gen(...):
v = reader.values()
self.assertIsNone(v)

当我尝试这样做时,我总是得到一个

AssertionError: <generator object next_values at 0x7fe2a5f9e3f0> is not None

所以,当我自己调用 values 时,它会返回一些东西(它是一个指针吗?)而不是生成的值。

当我考虑使用基本生成器模式时,我的问题比我自己的代码更广泛:测试 Python 生成器的正确方法是什么?

最佳答案

生成器是用来迭代的。您可以使用 next()函数来获取生成器的下一个值。请注意,如果您的生成器耗尽了它的值,它将引发 StopIteration。异常。

reader = Gen(...):
values = reader.values()
v = next(values)
self.assertIsNone(v)

关于python - 在 Python 中测试生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34346182/

相关文章:

python - Bokeh ,套索选择表更新

python - 在 Matplotlib 中为 Boxplot 提供自定义四分位数范围

cmocka自由运行和捕获异常

python - 是否可以将新的键/值添加到字典的开头而不是后面

python - 将 Autocomplete=off 应用到 Django 密码重置确认表单

Python2 与 Python3 post 请求

python - 如何使用 python 检测我的无线设备?

python - 无法使用docker run命令运行docker镜像

c# - 使用 C# Moq 模拟 ElasticSearch 客户端

c# - 常见项目的存储库模式