猿问

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

我试图在子类的setUporsetUpClass方法中修补一些函数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.


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


犯罪嫌疑人X
浏览 304回答 1
1回答

慕运维8079593

我认为你需要这样做: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。
随时随地看视频慕课网APP

相关分类

Python
我要回答