我正在使用nose进行测试。我知道如何跳过测试,但我想知道是否有一个简单的解决方案来编写装饰器以跳过测试,当某些模块未导入时。
现在我尝试导入mock并抓住ImportError
(如果未安装)并设置mock = None
。在需要模拟的测试开始时,我使用if not mock: raise SkipTest()
作为第一行。
这没关系。我只是想知道它是否也可以与装饰师合作?
我已经使用kindall's answer了一段时间,只是为了注意到今天,它仍然无法正常工作(至少不在所有情况下!
当我使用测试功能时,它似乎有效,即不是生成器(不包含yield
语句)。每当我在使用yield
的测试函数上使用装饰器时,无论assert
是否在屈服函数中失败,测试都会通过。
为什么会发生这种情况以及如何防止这种行为?
答案 0 :(得分:6)
不会有这样的工作吗?
import functools
def requires_mock(test):
@functools.wraps(test)
def wrapper():
if mock:
return test()
raise SkipTest
return wrapper
答案 1 :(得分:0)
装饰者应该是这样的:
def needsMock(fn):
def wrapped():
if mock is None: return
fn()
return wrapped
这会在mock
为None
时通过测试。您也可以尝试提升SkipTest()
但可能会干扰装饰器。
答案 2 :(得分:0)
灵感来自kindall的答案(有效)我试图让它在没有functools
的情况下再次运作:
def requires_mock(test):
def wrapper(*args, **kwargs):
if mock_not_available:
raise SkipTest()
else:
return test(*args, **kwargs)
wrapper.__name__ = test.__name__
return wrapper
它似乎也有效。 __name__
这一点非常重要,以便nose识别该函数并在相应的详细测试运行中标记它。
我希望我什么都不错过?对你的考试失去信心是一件令人伤心的事情:(