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

Bru*_*tus 3 python unit-testing nose

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

现在我尝试导入mock并捕获ImportError它是否未安装和设置mock = None.在需要模拟的测试开始时,我将其if not mock: raise SkipTest()用作第一行.

这没关系.我只是想知道它是否也可以用装饰器?

更新

一段时间以来,我一直在使用kindall的答案,只是为了注意,它仍然无法正常工作(至少在所有情况下都不行!

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

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

kin*_*all 6

不会像这样的工作吗?

import functools

def requires_mock(test):

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

    return wrapper
Run Code Online (Sandbox Code Playgroud)