Я не знаю, как это nose
работает точно.
Но ваш пример не может работать.
У вас есть дерево вызовов
test_foo()
-> run()
.
Поскольку run()
возвращает генератор, который не запускается до начала итерации, вы должны это сделать.
Либо сделать
def test_foo():
scenario = ScenarioHandler(__test_foo, [1, 2])
for f, a in scenario.run():
f(a)
или лучше, так как нос уже предоставляет это, явно проверяя флаги данной функции с помощью func.func_code.co_flags & CO_GENERATOR != 0
,
def test_foo():
scenario = ScenarioHandler(__test_foo, [1, 2])
for f, a in scenario.run():
yield f, a
для того, чтобы nose
совершал эти звонки.
(Там могло бы быть еще короче, т.е. использовать
test_meth = ScenarioHandler(__test_foo, [1, 2]).run
, который, увы, не работает, потому что методы явно не правильно определяются как допустимые цели вызова.)
Но вы можете добавить «создателя теста» в ваш класс.
# as method:
def make_test(self):
def test_generator():
for item in self.run():
yield item
return test_generator
Так что вы можете сделать
test_foo = ScenarioHandler(__test_foo, [1, 2]).make_test()
Но, вероятно, nose
предоставляет более эффективные способы инкапсуляции ваших тестов в классах путем создания подклассов TestCase
и TestSuite
.