Прежде всего, извините, если на этот вопрос уже был дан ответ, но я искал повсюду и ничего не смог найти.
У меня есть функция, которая делает это (в итоге):
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...
без удачи.Может ли кто-нибудь придумать, как этого достичь?Я видел, как издеваться над магическими методами, и мне показалось, что мне комфортно с юнит-тестированием, но в этом случае я не могу найти подходящего решения.Спасибо!