Совместим ли read(n) с mock_open?
Есть ли способ использовать read(some_number_of_bytes)
с mock_open
?
mock_open
работает как положено при чтении всего файла (read()
) или при чтении одной строки (readline()
), но я не могу заставить его работать при чтении нескольких байтов (read(n)
)
Эти фрагменты (адаптированные из документации Mock) работают (Python 2.7):
from mock import mock_open, patch
# works: consume entire "file"
with patch('__main__.open', mock_open(read_data='bibble')) as m:
with open('foo') as h:
result = h.read()
assert result == 'bibble' # ok
# works: consume one line
with patch('__main__.open', mock_open(read_data='bibble\nbobble')) as m:
with open('foo') as h:
result = h.readline()
assert result == 'bibble\n' # ok
Но попытка прочитать только несколько байтов не удалась -mock_open
возвращает весь read_data
вместо:
# consume first 3 bytes of the "file"
with patch('__main__.open', mock_open(read_data='bibble')) as m:
with open('foo') as h:
result = h.read(3)
assert result == 'bib', 'result of read: {}'.format(result) # fails
Выход:
Traceback (most recent call last):
File "/tmp/t.py", line 25, in <module>
assert result == 'bib', 'result of read: {}'.format(result)
AssertionError: result of read: bibble
В случае, если это проблема XY, я отмечу, что причина этого вопроса в том, что я высмеиваю файл, в который передаю pickle.load
который в свою очередь вызывает read(1)
,
with open('/path/to/file.pkl', 'rb') as f:
x = pickle.load(f) # this requires f.read(1) to work
Я бы предпочел издеваться над минимально возможным уровнем (open
скорее, чем pickle.load
).