0

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

我的代码redis经常使用,我想模拟一下。我想在全局范围内执行此操作,而不必担心在每次测试中都对其进行模拟,但我认为使用@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
4

1 回答 1

1

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

def setUp(self):
    self.redis = redis = patch('main.redis')
    redis.set = ...
    redis.get = ...
    redis.start()
    self.addCleanup(redis.stop)
于 2018-11-29T20:25:22.057 回答