如何在未导入模块时编写装饰器以跳过某些测试?

时间:2012-03-26 15:53:09

标签: python unit-testing nose

我正在使用nose进行测试。我知道如何跳过测试,但我想知道是否有一个简单的解决方案来编写装饰器以跳过测试,当某些模块未导入时。

现在我尝试导入mock并抓住ImportError(如果未安装)并设置mock = None。在需要模拟的测试开始时,我使用if not mock: raise SkipTest()作为第一行。

这没关系。我只是想知道它是否也可以与装饰师合作?

更新

我已经使用kindall's answer了一段时间,只是为了注意到今天,它仍然无法正常工作(至少不在所有情况下!

当我使用测试功能时,它似乎有效,即不是生成器(不包含yield语句)。每当我在使用yield的测试函数上使用装饰器时,无论assert是否在屈服函数中失败,测试都会通过。

为什么会发生这种情况以及如何防止这种行为?

3 个答案:

答案 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

这会在mockNone时通过测试。您也可以尝试提升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识别该函数并在相应的详细测试运行中标记它。

我希望我什么都不错过?对你的考试失去信心是一件令人伤心的事情:(