我试图在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>
你能解释一下这种行为吗?
因为
setUp
不是“静态”classmethod
,所以它需要类的实例。引用:unittest basic example
没有@classmethod装饰符,它的工作方式就不同了,因为在修改后的代码中,“cls”不再是类:它是实例。我们通常将实例指定为“self”,但是“self”和“cls”在Python中并不是保留词——它们只是约定。你可以把任何你想要的东西放在它们的位置,尽管这样做会引起混乱(这在原始代码中很明显)。
至于我认为两个版本的代码输出之间的不一致性,我不能用普通自定义类的方法来重现行为,所以它一定与unittest包有关。不过,我敢打赌这是因为类方法和实例方法之间的差异。
相关问题 更多 >
编程相关推荐