Как (или может) я получить генератор, вызываемый из теста на нос, для обработки носом? - PullRequest
1 голос
/ 07 февраля 2012

Я пытаюсь создать обобщенный обработчик данных, управляемый данными, который я могу вызвать из моих тестов на носу.Мой тестовый файл будет выглядеть так:

import ScenarioHandler

def test_foo():
    scenario = ScenarioHandler(__test_foo, [1, 2])
    scenario.run()

def __test_foo(var):
    assert var % 2 == 0, 'Odd!'

ScenarioHandler будет выглядеть примерно так:

class ScenarioHandler(object):

    def __init__(self, test, args):
        self.test = test
        self.args = args

    def run(self):
        for arg in self.args:
            yield self.test, arg

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, какпузырь генератор от ScenarioHandler.run() обратно в нос.Я попытался вернуть генератор из run() в test_foo(), и это тоже не помогло.Это вообще возможно?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Я не знаю, как это 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.

0 голосов
/ 07 февраля 2012

Почему бы вам не использовать что-то вроде:

def test_foo():
    for var in [1, 2]:
        yield __test_foo, var

См. Также add_tests(generator) функция из мой ответ .

...