Index: Python-3.3.0/Lib/unittest/mock.py =================================================================== --- Python-3.3.0.orig/Lib/unittest/mock.py +++ Python-3.3.0/Lib/unittest/mock.py @@ -2188,6 +2188,19 @@ def mock_open(mock=None, read_data=''): handle.write.return_value = None handle.__enter__.return_value = handle handle.read.return_value = read_data + handle.readline.side_effect = map(lambda x: '{}\n'.format(x), read_data.split('\n')) + + data_as_list = ['{}\n'.format(l) for l in read_data.split('\n')] + # If the last line ended in a newline, the list comprehension will have an + # extra entry that's just a newline. Remove this. + if data_as_list[-1] == '\n': + data_as_list = data_as_list[:-1] + else: + # if there wasn't an extra newline by itself, then the file being + # emulated doesn't have a newline to end the last line remove the + # newline that our naive format() added + data_as_list[-1] = data_as_list[-1][:-1] + handle.readlines.return_value = data_as_list mock.return_value = handle return mock Index: Python-3.3.0/Lib/unittest/test/testmock/testwith.py =================================================================== --- Python-3.3.0.orig/Lib/unittest/test/testmock/testwith.py +++ Python-3.3.0/Lib/unittest/test/testmock/testwith.py @@ -171,6 +171,31 @@ class TestMockOpen(unittest.TestCase): self.assertEqual(result, 'foo') + def test_readline_data(self): + mock = mock_open(read_data='foo\nbar\nbaz\n') + with patch('%s.open' % __name__, mock, create=True): + h = open('bar') + result = h.readline() + + self.assertEqual(result, 'foo\n') + + def test_readlines_data(self): + mock = mock_open(read_data='foo\nbar\nbaz\n') + with patch('%s.open' % __name__, mock, create=True): + h = open('bar') + result = h.readlines() + + self.assertEqual(result, ['foo\n', 'bar\n', 'baz\n']) + + # Test that files without a final newline will also be correctly + # emulated + mock = mock_open(read_data='foo\nbar\nbaz') + with patch('%s.open' % __name__, mock, create=True): + h = open('bar') + result = h.readlines() + + self.assertEqual(result, ['foo\n', 'bar\n', 'baz']) + if __name__ == '__main__': unittest.main()