繁体   English   中英

Python单元测试-运行时模拟补丁?

[英]Python Unit Testing - Mock Patch at Runtime?

我正在用python编写单元测试。

我的代码经常使用redis ,我想对此进行模拟。 我想在全球范围内进行此操作,而不必担心在每个测试中都对其进行@patch ,但是我认为使用@patch装饰器是不可能的。

工作测试示例-

class ExamplesTests(AbstractTestCase, unittest.TestCase):

    @patch('main.redis')
    def test_the_thing(self, redis: MagicMock):
        redis.set = self._my_mock_set # method that sets a dict val
        redis.get = self._my_mock_get # method that gets a dict val

        result = main.do_the_thing()

        self.assertTrue(result)

我实际上并不需要模拟缓存中的内容,我只是想避免需要清除其他进程正在使用的实际Redis缓存。 我想在这样setUp -

class AbstractTestCase(ABC):

    @patch('main.redis')
    def setUp(self, redis: MagicMock):
        redis.set = self._my_mock_set # method that sets a dict val
        redis.get = self._my_mock_get # method that gets a dict val

错误:setUp()接受2个位置参数,但给出了3个

除了修补每个测试之外,是否可以在没有装饰器的情况下使用安装程序? 像这样吗?

class AbstractTestCase(ABC):

    def setUp(self):
        redis = patch('main.redis')
        redis.set = self._my_mock_set # method that sets a dict val
        redis.get = self._my_mock_get # method that gets a dict val

您确实可以这样创建补丁,但随后还需要显式启用它。 测试完成后,您也想停止补丁。

def setUp(self):
    self.redis = redis = patch('main.redis')
    redis.set = ...
    redis.get = ...
    redis.start()
    self.addCleanup(redis.stop)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM