我正在尝试使用let ca = Color(1.,1.,1.)
let cb = ca
ca = cb
测试,并希望将其用于unittest方法。
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
中使用变量。
答案 0 :(得分:4)
一种解决方法是在装饰器中使用包含属性名称的字符串,并在测试函数中使用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
进行检查。
答案 1 :(得分:2)
当您假设它将被运行时,装饰器不会运行。在以下示例中:
class spam:
@eggs
def beans( self ):
pass
请记住,装饰器的使用与说法相同:
beans = eggs( beans )
在spam
范围内,紧接def
语句本身执行后。何时执行def
语句?在定义类及其方法时。装饰器修改方法spam.beans
的类级定义,而不是self.beans
的实例级值。当然,这种情况早在创建该类的任何实例之前就已经发生,即在对任何一个特定实例self
的引用有意义之前。
如果要将特定的可调用对象(例如,使用functools.partial
预先烘焙了某些参数的已修改test_param
可调用对象)附加到实例self
,您当然可以在里面实例方法之一(例如__init__
或setUp
)。
有些人会将类定义代码描述为“解析时”,而实例级代码则发生在“运行时”。您可能会或可能不会找到一种有用的思考方式,尽管几乎所有内容都是Python中的“运行时”。