Как я могу использовать 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
?