-
-
Notifications
You must be signed in to change notification settings - Fork 32.5k
Description
Bug report
Bug description:
The reset_mock(return_value=True)
method behaves in a wrong/inconsistent way.
When used with MagicMock
, the method reset_mock(return_value=True)
does not reset the return values of the magic methods. Only if you call for example __str__
and then call the reset_mock function, the return value will be reset, but not to the default value.
from unittest import mock
mm = mock.MagicMock()
print(type(mm.__str__()))
mm.reset_mock(return_value=True)
print(type(mm.__str__()))
print(type(mm.__hash__()))
mm.reset_mock(return_value=True)
print(type(mm.__hash__()))
Output
<class 'str'>
<class 'unittest.mock.MagicMock'>
<class 'int'>
<class 'unittest.mock.MagicMock'>
Since Python 3.9 PR reset_mock
now also resets child mocks. This explains the behaviour. Calling the __str__
method creates a child MagicMock
with a set return value. Since this child mock now exists, its return value is reset when reset_mock(return_value=True) is called.
Although this can be logically explained, it's counter-intuitive and annoying as I'm never sure which values are being reset.
I would expect the same behaviour as Mock
. The return value of __str__
and other magic methods should not be effected.
from unittest import mock
m = mock.Mock()
print(type(m.__str__()))
m.reset_mock(return_value=True)
print(type(m.__str__()))
print(type(m.__hash__()))
m.reset_mock(return_value=True)
print(type(m.__hash__()))
Output
<class 'str'>
<class 'str'>
<class 'int'>
<class 'int'>
CPython versions tested on:
3.10
Operating systems tested on:
Linux
Linked PRs
Metadata
Metadata
Assignees
Labels
Projects
Status