Python单元测试cas中的类方法

2024-05-19 02:51:32 发布

您现在位置: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>

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


Tags: 方法lambda函数truesavedefmyclassmethod
2条回答

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

引用:unittest basic example

没有@classmethod装饰符,它的工作方式就不同了,因为在修改后的代码中,“cls”不再是类:它是实例。我们通常将实例指定为“self”,但是“self”和“cls”在Python中并不是保留词——它们只是约定。你可以把任何你想要的东西放在它们的位置,尽管这样做会引起混乱(这在原始代码中很明显)。

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

相关问题 更多 >

    热门问题