我想为整个类模拟某些东西,但以下最小示例不起作用:
import time
import six
if six.PY2:
import mock
else:
from unittest import mock
@mock.patch('time.sleep', mock.Mock(side_effect=Exception('dooooom')))
class Foo(object):
def bar(self):
print('before')
time.sleep(1)
print('after')
f = Foo()
f.bar()
我得到这个意外的输出:(为什么time.sleep
没有加注?)
before
after
但是,如果我将@mock.patch(...)
向下移动1行,以便它装饰了方法bar
而不是类Foo
,那么它将按预期工作:
before
...
Exception: blah
为什么@mock.patch
在班级上不起作用?
答案 0 :(得分:0)
事实证明,类装饰器仅修补以patch.TEST_PREFIX
开头(默认为test
)的方法。
因此,将方法重命名为test_bar
甚至testbar
都会使补丁开始工作。
Docs:
修补程序可以用作
TestCase
类修饰符。它通过装饰类中的每个测试方法来工作。当您的测试方法共享一个公共补丁集时,这会减少样板代码。 patch()通过查找以patch.TEST_PREFIX
开头的方法名称来查找测试。默认情况下,它是'test'
,与unittest
查找测试的方式相匹配。您可以通过设置patch.TEST_PREFIX
来指定备用前缀。
显然,此行为适用于任何类,无论是否从unittest.TestCase
继承。