我试图在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>
你能解释一下这种行为吗?
答案 0 :(得分:0)
在没有@classmethod装饰器的情况下,它的工作方式有所不同,因为在修订的代码中,“ cls”不再是类:它是实例。我们通常将实例指定为“ self”,但是“ self”和“ cls”在Python中不是保留字,它们只是约定。您可以将所需的任何东西放在他们的位置,尽管这样做会引起混乱(如原始代码所示)。
至于我认为这两个版本的代码之间的输出不一致,我无法使用普通自定义类的方法来重现该行为,因此它必须与unittest包有关。但是,我敢打赌这是由于类方法和实例方法之间的差异。
答案 1 :(得分:-1)
由于setUp
不是“静态”classmethod
,因此需要该类的实例。