Запустите Mock, используя менеджер контекста, и получите аргумент open - PullRequest
0 голосов
/ 27 марта 2019

Прежде всего, извините, если на этот вопрос уже был дан ответ, но я искал повсюду и ничего не смог найти.

У меня есть функция, которая делает это (в итоге):

def func(path):
  with open(path) as f:
    json.load(f)

Я хочу выполнить его модульное тестирование, и мне хотелось бы, чтобы при использовании open в качестве диспетчера контекста f - это имя аргумента, который я передал открытию.У меня проблема в том, что я не могу смоделировать метод ввода в соответствующем модуле, он ломается каждый раз.Это то, что я делаю до сих пор:

def setUp(self):
    # Setup the content of the config files for the tests
    json.load = MagicMock(side_effect=file_content)

    # Opening a file returns the name of the file
    builtins.open = MagicMock(side_effect=lambda x: x) #1
    builtins.open.__enter__ = MagicMock(side_effect=builtins.open.return_value) #2

MagicMock номер 1 делает то, что я ожидаю, когда я запускаю open («test»), он возвращает «test».Тем не менее я не могу высмеять , введите , чтобы вернуть все, что я передал, чтобы открыть, это всегда дает сбой с AttributeError: __enter__.Я попытался также сделать

builtins.open.return_value.__enter__ = MagicMock...

без удачи.Может ли кто-нибудь придумать, как этого достичь?Я видел, как издеваться над магическими методами, и мне показалось, что мне комфортно с юнит-тестированием, но в этом случае я не могу найти подходящего решения.Спасибо!

1 Ответ

0 голосов
/ 27 марта 2019

Я понял!

Мне пришлось динамически определять побочный эффект, но, похоже, он работает нормально.Вот что я сделал:

def setUp(self):
    # Setup the content of the config files for the tests
    json.load = MagicMock(side_effect=file_content)

    # Opening a file returns the name of the file
    def get_mock_context(filename):
        mock_context = MagicMock()
        mock_context.__enter__.return_value = filename
        mock_context.__exit__.return_value = False
        return mock_context
    builtins.open = MagicMock(side_effect=get_mock_context)

Таким образом, возвращаемое значение представляет собой макет с методами __enter__ и __exit__, возвращающими именно то имя файла, которое я передал вызову open.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...