Модульное тестирование Python: сбой Nose @with_setup

Я делаю некоторые тесты. Множество моих тестовых функций имеют общие настройки, поэтому я решил использовать декоратор @with_setup из nose.tools. Я упростил свою проблему до этого:

from nose.tools import with_setup

class TestFooClass(unittest.TestCase):
   def setup_foo_value(self):
      self.foo = 'foobar'

   @with_setup(setup_foo_value)
   def test_something(self):
      print self.foo

Я получаю следующую ошибку:

$ python manage.py test tests/test_baz.py

E
======================================================================
ERROR: test_something (project.tests.test_baz.TestFooClass)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/user/Coding/project-backend/project/../project/tests/test_baz.py", line 17, in test_something
    print self.foo
AttributeError: 'TestFooClass' object has no attribute 'foo'

----------------------------------------------------------------------

Как будто setup_foo_value вообще не запускается. Любая помощь могла бы быть полезна!


person Alexandre    schedule 18.10.2012    source источник
comment
Знаете ли вы, что вы можете определить setUp() в своем подклассе unittest.TestCase для этого?   -  person ezod    schedule 19.10.2012


Ответы (3)


Согласно документу:

  • написание тестов: "Обратите внимание, что генераторы методов не поддерживаются в unittest.TestCase подклассах "
  • инструменты тестирования: "with_setup полезен только для тестовые функции, а не для тестовых методов или внутри подклассов TestCase"

Таким образом, вы можете либо переместить свой тестовый метод в функцию, либо добавить setUp метод для вашего класса.

person Schnouki    schedule 18.10.2012
comment
Супер полезно. Спасибо. - person Vikas; 22.10.2016

Попробуйте эту модификацию. Это сработало для меня.

from nose.tools import with_setup

def setup_foo_value(self):
    self.foo = 'foobar'

@with_setup(setup_foo_value)
def test_something(self):
    print self.foo
person Vikas    schedule 22.10.2016

Первоначальную идею можно реализовать следующим образом

import wrapt

@wrapt.decorator
def setup_foo_value(wrapped, instance, args, kwargs):
   instance.foo = 'foobar'
   return wrapped(*args, **kwargs)

class TestFooClass(unittest.TestCase):
   @setup_foo_value
   def test_something(self):
      print self.foo

Важно, что он дополнительно использует обернуть модуль Python

person Alexey    schedule 18.12.2015