Python单元测试用例中的类方法

时间:2013-04-17 05:19:48

标签: python

我试图在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>

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:-1)

由于setUp不是“静态”classmethod,因此需要该类的实例。

参考:unittest basic example