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
Bug report
Bug description:
The
reset_mock(return_value=True)method behaves in a wrong/inconsistent way.When used with
MagicMock, the methodreset_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.Output
Since Python 3.9 PR
reset_mocknow also resets child mocks. This explains the behaviour. Calling the__str__method creates a childMagicMockwith 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.Output
CPython versions tested on:
3.10
Operating systems tested on:
Linux
Linked PRs
MagicMocknot to reset magic method return values #124038MagicMocknot to reset magic method return values (GH-124038) #124231MagicMocknot to reset magic method return values (GH-124038) #124232