Совместим ли 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).

0 ответов

Для записи, эта проблема была исправлена ​​в Python 3.7.

Другие вопросы по тегам