3

我正在尝试在方法中模拟一个函数setUpClass(),然后在方法中恢复该函数tearDownClass()

class MyClass(unittest.TestCase):

    @classmethod
    def setUpClass(cls):

        cls.save_func = module.func
        module.func = lambda: True

    @classmethod
    def tearDownClass(cls):

        module.func = cls.save_func

在该tearDownClass()方法之后,我预计调用module.func()将调用实际函数。但事实并非如此。

我通过打印函数进行了一些调试。我从该tearDownClass()方法中得到了以下输出。

cls.save_func: <unbound method MyClass.save_func>
module.func:  <unbound method MyClass.save_func>

我正在尝试不同的事情,我将方法从类方法更改为设置方法:

     def setUp(cls):

        cls.save_func = module.func
        module.func = lambda: True


    def tearDown(cls):

        module.func = cls.save_func

令我惊讶的是,一切似乎都在工作。module.func恢复回来,当我打印它时,它给了我函数地址。

module.func <function func at 0x89f9a74>

你能解释一下这种行为吗?

4

2 回答 2

0

因为setUp不是“静态” classmethod,所以它需要类的实例。

参考:unittest基本例子

于 2013-04-17T06:47:39.667 回答
0

如果没有 @classmethod 装饰器,它的工作方式会有所不同,因为在修改后的代码中,“cls”不再是类:它是实例。我们通常将实例指定为“self”,但“self”和“cls”不是 Python 中的保留字——它们只是约定。您可以将任何您想要的东西放在它们的位置,尽管这样做会导致混乱(如原始代码中所示)。

至于我认为两个版本代码输出的不一致,我无法用普通自定义类的方法重现该行为,所以它必须与unittest包有关。但是,我敢打赌这是由于类方法和实例方法之间的差异。

于 2018-09-10T21:18:35.637 回答