@@ -331,6 +331,45 @@ def test_magic_methods_fspath(self):
331331 self .assertEqual (os .fspath (mock ), expected_path )
332332 mock .__fspath__ .assert_called_once ()
333333
334+ def test_magic_mock_does_not_reset_magic_returns (self ):
335+ # https://github.com/python/cpython/issues/123934
336+ for reset in (True , False ):
337+ with self .subTest (reset = reset ):
338+ mm = MagicMock ()
339+ self .assertIs (type (mm .__str__ ()), str )
340+ mm .__str__ .assert_called_once ()
341+
342+ self .assertIs (type (mm .__hash__ ()), int )
343+ mm .__hash__ .assert_called_once ()
344+
345+ for _ in range (3 ):
346+ # Repeat reset several times to be sure:
347+ mm .reset_mock (return_value = reset )
348+
349+ self .assertIs (type (mm .__str__ ()), str )
350+ mm .__str__ .assert_called_once ()
351+
352+ self .assertIs (type (mm .__hash__ ()), int )
353+ mm .__hash__ .assert_called_once ()
354+
355+ def test_magic_mock_resets_manual_mocks (self ):
356+ mm = MagicMock ()
357+ mm .__iter__ = MagicMock (return_value = iter ([1 ]))
358+ mm .custom = MagicMock (return_value = 2 )
359+ self .assertEqual (list (iter (mm )), [1 ])
360+ self .assertEqual (mm .custom (), 2 )
361+
362+ mm .reset_mock (return_value = True )
363+ self .assertEqual (list (iter (mm )), [])
364+ self .assertIsInstance (mm .custom (), MagicMock )
365+
366+ def test_magic_mock_resets_manual_mocks_empty_iter (self ):
367+ mm = MagicMock ()
368+ mm .__iter__ .return_value = []
369+ self .assertEqual (list (iter (mm )), [])
370+
371+ mm .reset_mock (return_value = True )
372+ self .assertEqual (list (iter (mm )), [])
334373
335374 def test_magic_methods_and_spec (self ):
336375 class Iterable (object ):
0 commit comments