当一个模块没有被导入时,如何编写一个decorator来跳过某些测试?

2024-06-25 22:32:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用nose进行测试。我知道如何跳过测试,但我想知道是否有一个简单的解决方案,在某些模块没有导入的情况下,编写一个decorator来跳过测试。在

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

那很好用。我只是想知道有没有可能和装修师一起?在

更新

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

当我使用一个测试函数时,它似乎可以工作,不是生成器(不包含yield语句)。每当我在使用yield的测试函数上使用decorator时,无论生成的函数中的assert失败,测试都会通过。在

你知道为什么会发生这种情况,以及如何防止这种行为吗?在


Tags: 模块noneifnot情况decorator解决方案mock
3条回答

在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__这一点很重要,因此{a1}可以识别该函数,并在详细的测试运行中相应地标记它。在

我希望我没有错过什么?对你的测试失去信心是件可悲的事

装饰工应该是这样的:

def needsMock(fn):
    def wrapped():
        if mock is None: return

        fn()

    return wrapped

mockNone时,这将使测试通过。您也可以尝试提升SkipTest(),但这可能会干扰装饰器。在

这样的东西不管用吗?在

import functools

def requires_mock(test):

    @functools.wraps(test)
    def wrapper():
        if mock:
            return test()
        raise SkipTest

    return wrapper

相关问题 更多 >