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

Python单元测试-运行时模拟补丁?,python,unit-testing,mocking,python-unittest,magicmock,Python,Unit Testing,Mocking,Python Unittest,Magicmock,我正在用python编写单元测试 我的代码经常使用redis,我想模拟一下。我想在全球范围内这样做,不必担心在每次测试中都会模仿它,但我认为使用@patch decorator是不可能的 工作测试示例- class ExamplesTests(AbstractTestCase, unittest.TestCase): @patch('main.redis') def test_the_thing(self, redis: MagicMock): redis.se

我正在用python编写单元测试

我的代码经常使用redis,我想模拟一下。我想在全球范围内这样做,不必担心在每次测试中都会模仿它,但我认为使用@patch decorator是不可能的

工作测试示例-

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缓存的需要。我试着在设置中这样做-

错误:安装程序接受2个位置参数,但提供了3个

不必修补每个测试,是否可以在不使用decorator的情况下使用setup?像这样的-

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)
def setUp(self):
    self.redis = redis = patch('main.redis')
    redis.set = ...
    redis.get = ...
    redis.start()
    self.addCleanup(redis.stop)