为什么是模拟补丁班主任不工作?

2022-07-06 11:51:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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在类级别不起作用?你知道吗


Tags: import示例iffootimeexceptionbarsleepmockpatchprintsixafterbeforepy2
1条回答
网友
1楼 ·

结果发现,类装饰器只修补以patch.TEST_PREFIX开头的方法,默认为test。你知道吗

因此,将方法重命名为test_bar甚至testbar可以使修补程序开始工作。你知道吗

Docs

Patch can be used as a TestCase class decorator. It works by decorating each test method in the class. This reduces the boilerplate code when your test methods share a common patchings set. patch() finds tests by looking for method names that start with patch.TEST_PREFIX. By default this is 'test', which matches the way unittest finds tests. You can specify an alternative prefix by setting patch.TEST_PREFIX.

显然,这种行为适用于任何类,无论是否从unittest.TestCase继承。你知道吗