为了账号安全,请及时绑定邮箱和手机立即绑定

在测试用例中的 setUp 或 setUpClass 中修补装饰器不起作用

在测试用例中的 setUp 或 setUpClass 中修补装饰器不起作用

犯罪嫌疑人X 2021-07-20 17:18:21
我试图在子类的setUporsetUpClass方法中修补一些函数unittest.TestCase。给定一个模块 patch_me_not.py# patch_me_not.pydef patch_me(at):    print('I am not patched at {}.'.format(at))def patch_me_not(at):    patch_me(at)以下脚本产生了更多我期望的输出。# main.pyimport unittestfrom unittest.mock import patchfrom 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.000sOK如果补丁在setUp和setUpClass.如何在这些方法中应用模拟补丁?
查看完整描述

1 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

我认为你需要这样做:


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". 这就是为什么您的解决方案不起作用的原因。


这是来自 unittest 文档的相关引用


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


查看完整回答
反对 回复 2021-07-28
  • 1 回答
  • 0 关注
  • 303 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信