Я запрограммировал очень простой генератор в Python 3.4:Тестирование генератора в Python
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)
код работает, когда я использую для цикла, чтобы потреблять сгенерированные значения:
reader = Gen(...):
for v in reader.values():
print(v)
Но я m теперь пытаюсь создать единичный тест, и для этого мне нужно будет получать каждое значение за раз (вне цикла). Я пытаюсь что-то вроде этого:
import unittest
#...
reader = Gen(...):
v = reader.values()
self.assertIsNone(v)
Когда я пытаюсь это, я всегда получаю
AssertionError: <generator object next_values at 0x7fe2a5f9e3f0> is not None
Так что, когда я называю значения себя, что-то вернуть (это указатель ?) вместо генерируемого значения.
Поскольку я рассматриваю, что использую базовый генераторный шаблон, мой вопрос немного шире, чем мой собственный код: каков правильный способ тестирования генератора Python?
Если вы хотите экземпляры вашего класса чтобы быть последовательным, вы должны внедрять '__iter__' и' __next__', см., например, https://docs.python.org/3/library/stdtypes.html#typeiter. Кроме того, у вас есть проблема, что 'next_value()' создает совершенно новый генератор, не давая вам следующего значения из существующего (поэтому имя мало вводит в заблуждение). – jonrsharpe
@jonrsharpe Получил это! Я меняю имя метода, чтобы отразить ваше важное наблюдение ... Я получал неправильный метод. Благодарю. Но на самом деле мне не нужны методы '__iter__' и' __next__', поскольку «yield» дает мне все сразу. – Nigini
Вам не нужно '__next__' обязательно, но если вы переименуете его метод в' __iter__', вы можете перебрать его непосредственно по экземпляру, а не явно вызвать метод для этого. – jonrsharpe