在TestCases中的setUp或setUpClass中修补装饰器不起作用

时间:2018-10-24 15:35:17

标签: python testing mocking python-unittest

我正在尝试在setUp子类的setUpClassunittest.TestCase方法中修补某些功能。

给出一个模块patch_me_not.py

# patch_me_not.py
def patch_me(at):
    print('I am not patched at {}.'.format(at))

def patch_me_not(at):
    patch_me(at)

以下脚本会产生我期望的更多输出。

# main.py
import unittest
from unittest.mock import patch
from patch_me_not import patch_me_not


@patch('patch_me_not.patch_me', lambda x: None)
class PatchMeNotTests(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print('I am the setUpClass.')
        patch_me_not('setUpClass')

    def setUp(self):
        print('I am the setUp.')
        patch_me_not('setUp')

    def test_print(self):
        print('I am the test')
        patch_me_not('test_print')


if __name__ == '__main__':
    unittest.main()

测试脚本输出为

I am the setUpClass.
I am not patched at setUpClass.
I am the setUp.
I am not patched at setUp.
I am the test
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

如果修补程序在setUpsetUpClass中起作用,那么我不希望输出中出现两行“我没有在...处打补丁”。

我如何才能在这些方法中应用模拟补丁?

1 个答案:

答案 0 :(得分:1)

我认为您需要这样做:

class PatchMeNotTests(unittest.TestCase):

    @classmethod
    @patch('patch_me_not.patch_me', lambda x: None)
    def setUpClass(cls):
        print('I am the setUpClass.')
        patch_me_not('setUpClass')

    @patch('patch_me_not.patch_me', lambda x: None)
    def setUp(self):
        print('I am the setUp.')
        patch_me_not('setUp')

    def test_print(self):
        print('I am the test')
        patch_me_not('test_print')

修补测试用例无效,因为将patch应用于TestCase时,它仅修补 测试方法,或更具体地说:以可配置前缀开头的方法patch.TEST_PREFIX,默认值为"test"。这就是为什么您的解决方案不起作用的原因。

这是单元测试文档中的相关报价

  

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