我正在尝试在setUp
子类的setUpClass
或unittest.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
如果修补程序在setUp
和setUpClass
中起作用,那么我不希望输出中出现两行“我没有在...处打补丁”。
我如何才能在这些方法中应用模拟补丁?
答案 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
。