1

我刚刚遇到了一个问题@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可以在另一个模块或此模块中更改(这无关紧要)。在这两种情况下Setting.flag==True,呼叫期间的条件test_something仍然采用“假”值,尽管它已经更改为“真”值。这很奇怪,我承认我不明白这种机制是如何工作的。似乎在测试期间无法更改此装饰器中使用的值。也许还有其他一些有趣的方法可以在特定条件下跳过测试,这可能会在测试期间发生变化。有谁知道如何解决这个问题?

4

1 回答 1

2

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

为了skipIf()按您的意愿工作,它需要采用函数(例如lambda: Settings.flag==True)而不是布尔值。然后,当实际调用装饰函数时,它将能够评估此条件。但它实际上并不是这样工作的。(不过,这可能是一个易于添加的增强功能。)

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

此外,有些东西看起来很可疑Settings.flag==True......我不能完全理解它...... ;-)

于 2012-05-09T22:32:11.237 回答