2

我正在尝试使用nose_parameterized测试并希望将其用于单元测试方法。

from nose.tools import assert_equal
from nose_parameterized import parameterized
import unittest

Class TestFoo(unittest.TestCase):
      def setUp(self):
           self.user1 = "Bar"
           self.user2 = "Foo"

      @parameterized.expand([
               ("testuser1",self.user1,"Bar"),
               ("testuser2",self.user2,"Foo")
                ]
      def test_param(self,name,input,expected):
          assert_equal(input,expected)

但是self没有在装饰器函数中定义。有解决方法吗?我知道我可以使用全局类变量,但我需要在setUp.

4

2 回答 2

5

getattr一种解决方法是在装饰器和测试函数中使用包含属性名称的字符串:

@parameterized.expand([
           ("testuser1", "user1", "Bar"),
           ("testuser2", "user2", "Foo")
            ])
def test_param(self, name, input, expected):
    assert_equal(getattr(self, input), expected)

使用这种方法,test_param假设它的input参数的值是属性名,其值应该被检查expected

于 2015-12-11T18:19:39.860 回答
3

当您似乎认为它会运行时,装饰器不会运行。在以下示例中:

class spam:
    @eggs
    def beans( self ):
        pass

请记住,装饰器的使用与说:

beans = eggs( beans )

spam范围内,在语句本身执行后立即def。什么时候def执行语句?当时定义了类及其方法。装饰器修改方法的类级别定义spam.beans,而不是实例级别的值self.beans。当然,这发生在该类的任何实例self被创建之前很久,即在对任何一个特定实例的引用之前, ,是有意义的。

如果您想将特定的可调用对象(例如test_param,使用 预烘焙了某些参数的修改后的可调用对象)附加functools.partial到实例self,您当然可以其中一个实例方法(例如__init__setUp)中执行此操作。

有些人会将类定义代码描述为发生在“解析时”,而将实例级代码描述为发生在“运行时”。尽管实际上几乎所有内容在 Python 中都是“运行时”的,但您可能会也可能不会发现这是一种有用的思考方式。

于 2015-12-11T18:16:48.123 回答