【问题标题】:Python Unit Testing - Mock Patch at Runtime?Python 单元测试 - 运行时的模拟补丁?
【发布时间】:2018-11-29 20:19:19
【问题描述】:

我正在用 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 个

除了修补每个测试之外,是否可以在没有装饰器的情况下使用 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

【问题讨论】:

    标签: python unit-testing mocking python-unittest magicmock


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      相关资源
      最近更新 更多