python - 获取 [@unittest.skipIf 装饰器] 条件的过时值

标签 python unit-testing decorator

我刚刚遇到了 @unittest.skipIf(expression) 的问题。好吧,问题是,如果我在装饰器中使用在开始测试之前声明并赋值的变量,并且在测试期间该变量的值发生更改,则效果是装饰器包含旧值。例如:

class Settings(object):
    flag=False
class TestCase(object):

    # during the test variable is changed (in this module or another)
    Settings.flag=True

    @unittest.skipIf(Settings.flag==True)
    def test_something(self):
        ...

Settings.flag 的值可以在另一个模块或此模块中更改(这并不重要)。在这两种情况下,调用 test_something 期间的条件 Setting.flag==True 仍然采用“False”值,尽管它已更改为“True”值。这很奇怪,我承认我不明白这个机制是如何运作的。看来这个装饰器中使用的值在测试过程中无法更改。也许有一些其他有趣的方法可以在特定条件下跳过测试,该条件可能会在测试期间发生变化。有谁知道如何解决这个问题?

最佳答案

是的,这是预期的行为。函数参数在调用函数时进行求值。装饰器是一个在定义被装饰的函数时调用的函数。因此,在定义修饰函数时会测试该标志。装饰者无法知道测试是什么;它只能看到 TrueFalse(或更可能是真实或虚假),因此它无法存储条件以供以后评估。

要让 skipIf() 按您想要的方式工作,它需要采用一个函数(例如 lambda: Settings.flag==True)而不是 bool 值。然后,当实际调用装饰函数时,它就能够评估这个条件。但实际上并非如此。 (不过,这可能是一个很容易添加的增强功能。)

您可以通过在 Settings.flag 的值确定之前不导入包含单元测试的模块来解决此问题。这将推迟测试函数的定义(以及装饰),直到那时,装饰器将有权访问标志的所需值。不知道您的代码是如何构造的,我不知道这对您是否实用。

此外,Settings.flag==True 看起来有些可疑...无法完全确定它...;-)

关于python - 获取 [@unittest.skipIf 装饰器] 条件的过时值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524440/

相关文章:

Python向所有集合的元素添加一个字符串

python - 如何断言 python unittest 没有引发错误

java - 使用新功能丰富类的设计模式

unit-testing - 测试重定向 CakePHP 2.0

c++ - 无法构建谷歌模拟

c# - 当 bool 更改为 true 时,为什么我的自定义装饰器/装饰器不起作用?

python - 如何清理 Django View 中的多个嵌套 if 语句

Python 守护进程没有显示错误输出

python - 使用 BeautifulSoup 在 python 中进行编码

python - 在 Celery 中实现 Twisted 风格的本地多个延迟回调