Python单元测试-运行时模拟补丁?
我正在用python编写单元测试 我的代码经常使用redis,我想模拟一下。我想在全球范围内这样做,不必担心在每次测试中都会模仿它,但我认为使用@patch decorator是不可能的 工作测试示例-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
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)