0
我有一個產生測試用例的基類。類註冊測試的具體實現。由於鼻子只支持測試函數產生的測試生成(不是類),我想要一個類裝飾器,它應用必要的函數包裝。蟒蛇動態測試代
注:我需要產生測試用例的原因是測試類需要做一些無法在setUp中運行的初始化。
下面是一個小例子,顯示了預期的行爲,但是,它只有在make_generator
裝飾是在當前模塊的工作 - 當我把它移到一個單獨的模塊沒有測試產生。有人能告訴我爲什麼會發生這種情況嗎?
def make_generator(cls):
"""returns a function that instantiates ``cls`` and yields tests. """
def generator():
obj = cls()
for t in obj:
yield t
generator.__name__ = 'test_%s' % cls.__name__
return generator
def register(func):
"""Set _check attr of ``func``. """
func._check = True
return func
class BaseMixin(object):
def __init__(self):
"""Register check handlers. """
self.check_handlers = []
attrs = (attr for attr in dir(self) if not attr.startswith('__'))
for attr in attrs:
func = getattr(self, attr)
if getattr(func, '_check', False):
self.check_handlers.append(attr)
def __iter__(self):
"""Generate tests for registered handlers. """
# do stuff
args = []
for check in self.check_handlers:
func = getattr(self, check)
yield func, args
@make_generator
class ConcreteTest(BaseMixin):
@register
def check_foobar(self, args):
assert False
我有點困惑,爲什麼你正在做一個發電機,而不是隻用鼻子的鴨打字模式?爲什麼讓你的生活更難? – Greg
你的意思是什麼鼻子的鴨子打字模式? –
我的意思是沿'def test_foo():'def test_baz():'聲明所有的測試。你在用鼻子嗎? – Greg