我刚刚遇到了 @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”值。这很奇怪,我承认我不明白这个机制是如何运作的。看来这个装饰器中使用的值在测试过程中无法更改。也许有一些其他有趣的方法可以在特定条件下跳过测试,该条件可能会在测试期间发生变化。有谁知道如何解决这个问题?
最佳答案
是的,这是预期的行为。函数参数在调用函数时进行求值。装饰器是一个在定义被装饰的函数时调用的函数。因此,在定义修饰函数时会测试该标志。装饰者无法知道测试是什么;它只能看到 True
或 False
(或更可能是真实或虚假),因此它无法存储条件以供以后评估。
要让 skipIf()
按您想要的方式工作,它需要采用一个函数(例如 lambda: Settings.flag==True
)而不是 bool 值。然后,当实际调用装饰函数时,它就能够评估这个条件。但实际上并非如此。 (不过,这可能是一个很容易添加的增强功能。)
您可以通过在 Settings.flag
的值确定之前不导入包含单元测试的模块来解决此问题。这将推迟测试函数的定义(以及装饰),直到那时,装饰器将有权访问标志的所需值。不知道您的代码是如何构造的,我不知道这对您是否实用。
此外,Settings.flag==True
看起来有些可疑...无法完全确定它...;-)
关于python - 获取 [@unittest.skipIf 装饰器] 条件的过时值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524440/