Дразнить метод `fileno` объекта` file` из Python 2 - PullRequest
0 голосов
/ 20 января 2019

Как я могу использовать mock.patch для переноса метода file.fileno на объект Python 2 ?

Когда я пытаюсь использовать обычный mock.patch.object в экземпляре file:

# file-fileno-mock.py

import sys
import tempfile

if sys.version_info < (3, 0):
    import mock
else:
    from unittest import mock


(foo_fileno, foo_file_path) = tempfile.mkstemp()

# Open the temporary file path and get a real file object.
with open(foo_file_path) as foo_file:
    # Patch a single attribute on the real `foo_file` object.
    with mock.patch.object(foo_file, 'fileno'):
        # Access the `fileno` method and call it,
        # which because of the mock wrapper will call a mock method instead.
        fake_foo_fileno = foo_file.fileno()
        assert fake_foo_fileno != foo_fileno

Это работает в Python 3, но в Python 2 это вызывает AttributeError:

Traceback (most recent call last):
  File "file-fileno-mock.py", line 15, in <module>
    with mock.patch.object(foo_file, 'fileno'):
  File "[…]/mock/mock.py", line 1460, in __enter__
    setattr(self.target, self.attribute, new_attr)
AttributeError: 'file' object attribute 'fileno' is read-only

Очевидно, mock.patch пытается написать foo_file.fileno атрибутов; тип Python 2 file запрещает это, Python 3 эквивалент позволяет.

Как я могу использовать mock.patch как предполагалось на объекте Python 2 file, не нарушая этого специального ограничения в Python 2 file?

...