diff options
author | Robert Collins <rbtcollins@hp.com> | 2015-07-24 03:48:20 +1200 |
---|---|---|
committer | Robert Collins <rbtcollins@hp.com> | 2015-07-24 03:48:20 +1200 |
commit | ca647ef60aa74e3dea81a399ded20c648a69e742 (patch) | |
tree | 041db4c6d33f51e0965162ae4521838c8cf469dc /Lib/unittest/mock.py | |
parent | 80e4f30e64e2e5f8506f8342f6fca63eab20a4ab (diff) | |
download | cpython-git-ca647ef60aa74e3dea81a399ded20c648a69e742.tar.gz |
Issue #21750: Further fixup to be styled like other mock APIs.
Diffstat (limited to 'Lib/unittest/mock.py')
-rw-r--r-- | Lib/unittest/mock.py | 79 |
1 files changed, 43 insertions, 36 deletions
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index 74f918a5f3..3fbe846fc6 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -2278,6 +2278,24 @@ def mock_open(mock=None, read_data=''): `read_data` is a string for the `read` methoddline`, and `readlines` of the file handle to return. This is an empty string by default. """ + def _readlines_side_effect(*args, **kwargs): + if handle.readlines.return_value is not None: + return handle.readlines.return_value + return list(_state[0]) + + def _read_side_effect(*args, **kwargs): + if handle.read.return_value is not None: + return handle.read.return_value + return ''.join(_state[0]) + + def _readline_side_effect(): + if handle.readline.return_value is not None: + while True: + yield handle.readline.return_value + for line in _state[0]: + yield line + + global file_spec if file_spec is None: import _io @@ -2286,42 +2304,31 @@ def mock_open(mock=None, read_data=''): if mock is None: mock = MagicMock(name='open', spec=open) - def make_handle(*args, **kwargs): - # Arg checking is handled by __call__ - def _readlines_side_effect(*args, **kwargs): - if handle.readlines.return_value is not None: - return handle.readlines.return_value - return list(_data) - - def _read_side_effect(*args, **kwargs): - if handle.read.return_value is not None: - return handle.read.return_value - return ''.join(_data) - - def _readline_side_effect(): - if handle.readline.return_value is not None: - while True: - yield handle.readline.return_value - for line in _data: - yield line - - handle = MagicMock(spec=file_spec) - handle.__enter__.return_value = handle - - _data = _iterate_read_data(read_data) - - handle.write.return_value = None - handle.read.return_value = None - handle.readline.return_value = None - handle.readlines.return_value = None - - handle.read.side_effect = _read_side_effect - handle.readline.side_effect = _readline_side_effect() - handle.readlines.side_effect = _readlines_side_effect - _check_and_set_parent(mock, handle, None, '()') - return handle - - mock.side_effect = make_handle + handle = MagicMock(spec=file_spec) + handle.__enter__.return_value = handle + + _state = [_iterate_read_data(read_data), None] + + handle.write.return_value = None + handle.read.return_value = None + handle.readline.return_value = None + handle.readlines.return_value = None + + handle.read.side_effect = _read_side_effect + _state[1] = _readline_side_effect() + handle.readline.side_effect = _state[1] + handle.readlines.side_effect = _readlines_side_effect + + def reset_data(*args, **kwargs): + _state[0] = _iterate_read_data(read_data) + if handle.readline.side_effect == _state[1]: + # Only reset the side effect if the user hasn't overridden it. + _state[1] = _readline_side_effect() + handle.readline.side_effect = _state[1] + return DEFAULT + + mock.side_effect = reset_data + mock.return_value = handle return mock |