Модульное тестирование Python - пробный патч во время выполнения? - PullRequest
0 голосов
/ 29 ноября 2018

Я пишу юнит-тесты на 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

1 Ответ

0 голосов
/ 29 ноября 2018

Вы действительно можете создать такой патч, но вам нужно также явно включить его.Вы также захотите остановить патч после завершения теста.

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