我有一个类,我通过给出一个文件名来实例化parser = ParserClass('/path/to/file')
,然后我调用parser.parse()
打开并读取文件的方法。
现在我想对内部发生不好的事情进行单元测试:
with open(filename, 'rb') as fp:
// do something
将引发正确的异常,所以我想模拟__builtin__.open
这样的:
from mock import MagicMock, patch
from StringIO import StringIO
test_lines = StringIO("""some test lines, emulating a real file content""")
mock_open = MagicMock(return_value=test_lines)
with patch('__builtin__.open', mock_open):
self.mock.parse()
但这给了我一个AttributeError: StringIO instance has no attribute '__exit__'
.
我认为 StringIO 的行为与文件对象完全一样,但似乎情况并非如此。
我怎么能用给定的内容(test_lines)和模拟对象来测试这个方法?我应该改用什么?