Встроенная функция насмешки read() в Python, поэтому она вызывает исключение

Я пытаюсь проверить обработку ошибок класса, и мне нужно смоделировать read() поднимая MemoryError, Это упрощенный пример.

import mock

def memory_error_read():
    raise MemoryError

def read_file_by_filename(filename):
    try:
        handle = open(filename)
        content = handle.read()
    except MemoryError:
        raise Exception("%s is too big" % self.filename)
    finally:
        handle.close()

    return content

@mock.patch("__builtin__.file.read", memory_error_read)
def testfunc():
    try:
        read_file_by_filename("/etc/passwd")
    except Exception, e:
        return
    print("Should have received exception")

testfunc()

Когда я запускаю это, я получаю следующую трассировку.

# ./read_filename.py 
Traceback (most recent call last):
  File "./read_filename.py", line 34, in <module>
    testfunc()
  File "build/bdist.linux-i686/egg/mock.py", line 1214, in patched
  File "build/bdist.linux-i686/egg/mock.py", line 1379, in __exit__
TypeError: can't set attributes of built-in/extension type 'file'

Похоже, я не могу исправить встроенную функцию чтения. Есть ли способ обмануть это? Можно ли делать то, что я хочу?

ОТВЕТ

Вот обновленный код, основанный на предложении Бена ниже.

from __future__ import with_statement

...

def test_func():
    with mock.patch("__builtin__.open", new_callable=mock.mock_open) as mo:
        mock_file = mo.return_value
        mock_file.read.side_effect = MemoryError

        try:
            read_file_by_filename("/etc/passwd")
        except Exception, e:
            if "is too big" in str(e):
                return
            else:
                raise

        print("Should have caught an exception")

1 ответ

Решение

Вы смотрели на mock_open?

Вы должны иметь возможность возвращать фиктивный объект, который имеет побочный эффект повышения исключений в read().

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