为什么ock.match.patch类修饰器不起作用?

时间:2019-02-19 09:56:50

标签: python mocking

我想为整个类模拟某些东西,但以下最小示例不起作用:

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在班级上不起作用?

1 个答案:

答案 0 :(得分:0)

事实证明,类装饰器仅修补以patch.TEST_PREFIX开头(默认为test)的方法。

因此,将方法重命名为test_bar甚至testbar都会使补丁开始工作。

Docs

  

修补程序可以用作TestCase类修饰符。它通过装饰类中的每个测试方法来工作。当您的测试方法共享一个公共补丁集时,这会减少样板代码。 patch()通过查找以patch.TEST_PREFIX开头的方法名称来查找测试。默认情况下,它是'test',与unittest查找测试的方式相匹配。您可以通过设置patch.TEST_PREFIX来指定备用前缀。

显然,此行为适用于任何类,无论是否从unittest.TestCase继承。