Самый верный ответ полезен, но я немного расширил его.
Если вы хотите установить значение вашего файлового объекта (f
в as f
) на основе аргументов, переданных в open()
вот один из способов сделать это:
def save_arg_return_data(*args, **kwargs):
mm = MagicMock(spec=file)
mm.__enter__.return_value = do_something_with_data(*args, **kwargs)
return mm
m = MagicMock()
m.side_effect = save_arg_return_array_of_data
# if your open() call is in the file mymodule.animals
# use mymodule.animals as name_of_called_file
open_name = '%s.open' % name_of_called_file
with patch(open_name, m, create=True):
#do testing here
В принципе, open()
вернет объект, а with
вызовет __enter__()
на этом объекте.
To макет, мы должны издеваться над open()
, чтобы вернуть макет объекта. Затем этот издевательский объект должен издеваться над ним __enter__()
(MagicMock
сделает это для нас), чтобы вернуть нужный нам файл / файл (следовательно mm.__enter__.return_value
). Выполнение этого с помощью 2 mocks выше, позволяет нам захватывать аргументы, переданные в open()
, и передавать их нашему методу do_something_with_data
.
Я передал весь макет файла в виде строки в open()
и my do_something_with_data
выглядел так:
def do_something_with_data(*args, **kwargs):
return args[0].split("\n")
Это преобразует строку в список, поэтому вы можете сделать следующее, как в обычном файле:
for line in file:
#do action