Open mentalAdventurer opened 2 weeks ago
Thank you for the report. I will take a look soon :)
Since this child mock now exists, its return value is reset when reset_mock(return_value=True) is called.
Yes, this is correct.
I would expect the same behaviour as Mock. The return value of str and other magic methods should not be effected.
Mock
does not mock magic methods at all, so they are unaffected at any case. Compare:
print(type(mock.Mock().__str__))
# <class 'method-wrapper'>
print(type(mock.MagicMock().__str__))
# <class 'unittest.mock.MagicMock'>
But, I agree that retuning <class 'unittest.mock.MagicMock'>
from __str__
is not correct.
So, my proposed solution is to ignore cases when:
MagicMock
instancereturn_value
is True
Bug report
Bug description:
The
reset_mock(return_value=True)
method behaves in a wrong/inconsistent way. When used withMagicMock
, 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_mock
now also resets child mocks. This explains the behaviour. Calling the__str__
method creates a childMagicMock
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.Output
CPython versions tested on:
3.10
Operating systems tested on:
Linux
Linked PRs