2015-03-08 6 views
2

Я пытаюсь написать тестовый класс, который включает в себя генератор и запустить тест с nosetests. Тем не менее, я смущен тем, как nosetests тест бегун, кажется, изолируют методы в тестовом классе, так что они не одни и те же self:Поведение метода генератора Nosetest

class Test(object): 

    def check(self): 
     print self.one 

    def test(self): 
     self.one = 1 
     yield self.check 

Это дает мне следующее сообщение об ошибке:

AttributeError: 'Test' object has no attribute 'one' 

Я предполагаю, что это имеет какое-то отношение к носу, изолируя тесты друг от друга. Есть ли какая-то работа, отличная от передачи всех необходимых переменных в ящик явно вместо неявно в качестве атрибутов на self?

Чтобы быть ясным, я знаю, как назначать атрибуты в «стандартном» Python. Я не об этом спрашиваю. Я хочу знать, как я могу достичь желаемого поведения в тестовом прогоне nosetests с помощью команды nosetests.


Per Tanveer's предложение я мог бы добавить __init__ метод для инициализации атрибута. Это обход, но он отвечает на мой вопрос, как я изначально его представлял.

Однако, в конечном итоге, я хочу, чтобы он выполнял цикл с помощью инструкции yield, изменяя значение атрибута на self и имея этот регистр изменений в значении self в методе check. Добавление __init__ не позволяет мне это делать.

class Test(object): 

    def __init__(self): 
     self.one = None 

    def check(self): 
     print self.one 

    def test(self): 
     self.one = 1 
     yield self.check 

я получаю:

$ nosetests nosetest-with-classes.py --nocapture 
None 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.000s 

OK 

Там еще, кажется, некоторый тип изоляции метод уровня проводится в жизнь с помощью бегунка nosetests. Поэтому я хотел бы немного углубиться, чтобы понять, что происходит. Есть ли способ обменивать атрибуты в переменной self обычным способом?

+0

Вы можете включить метод '__init__' и инициализировать свой экземпляр с помощью' one' в качестве аргумента. –

ответ

1

Короткий ответ: нет, вы не можете передать состояние, используя переменные экземпляра класса. При попадании уроков для методов класса нос всегда будет определять, к какому классу относится этот метод, и создаст новый экземпляр этого класса, который не будет иметь никаких атрибутов, которые вы, как правило, устанавливаете в текущем экземпляре класса тестового поколения (см. nose lines that actually do that). Одним из решений может быть использование переменных класса для передачи информации, которую вы хотите, что-то вроде этого:

class Test(object): 
    def check(self): 
     print self.one # here it really refers to Test.one 

    def test(self): 
     Test.one = 1 
     yield self.check 

Но я предлагаю смотреть в nose-parameterized plugin, он делает некоторые из магии, которую вы пытаетесь достичь здесь.