@@ -473,6 +473,54 @@ def assert_wrapper(
473473 raise e
474474
475475
476+ def assert_has_calls_wrapper (
477+ __wrapped_mock_method__ : Callable [..., Any ], * args : Any , ** kwargs : Any
478+ ) -> None :
479+ __tracebackhide__ = True
480+ try :
481+ __wrapped_mock_method__ (* args , ** kwargs )
482+ return
483+ except AssertionError as e :
484+ any_order = kwargs .get ("any_order" , False )
485+ if getattr (e , "_mock_introspection_applied" , 0 ) or any_order :
486+ msg = str (e )
487+ else :
488+ __mock_self = args [0 ]
489+ msg = str (e )
490+ if __mock_self .call_args_list is not None :
491+ actual_calls = list (__mock_self .call_args_list )
492+ expect_calls = args [1 ]
493+ introspection = ""
494+ from itertools import zip_longest
495+
496+ for actual_call , expect_call in zip_longest (actual_calls , expect_calls ):
497+ if actual_call is not None :
498+ actual_args , actual_kwargs = actual_call
499+ else :
500+ actual_args = tuple ()
501+ actual_kwargs = {}
502+
503+ if expect_call is not None :
504+ _ , expect_args , expect_kwargs = expect_call
505+ else :
506+ expect_args = tuple ()
507+ expect_kwargs = {}
508+
509+ try :
510+ assert actual_args == expect_args
511+ except AssertionError as e_args :
512+ introspection += "\n Args:\n " + str (e_args )
513+ try :
514+ assert actual_kwargs == expect_kwargs
515+ except AssertionError as e_kwargs :
516+ introspection += "\n Kwargs:\n " + str (e_kwargs )
517+ if introspection :
518+ msg += "\n \n pytest introspection follows:\n " + introspection
519+ e = AssertionError (msg )
520+ e ._mock_introspection_applied = True # type:ignore[attr-defined]
521+ raise e
522+
523+
476524def wrap_assert_not_called (* args : Any , ** kwargs : Any ) -> None :
477525 __tracebackhide__ = True
478526 assert_wrapper (_mock_module_originals ["assert_not_called" ], * args , ** kwargs )
@@ -495,7 +543,9 @@ def wrap_assert_called_once_with(*args: Any, **kwargs: Any) -> None:
495543
496544def wrap_assert_has_calls (* args : Any , ** kwargs : Any ) -> None :
497545 __tracebackhide__ = True
498- assert_wrapper (_mock_module_originals ["assert_has_calls" ], * args , ** kwargs )
546+ assert_has_calls_wrapper (
547+ _mock_module_originals ["assert_has_calls" ], * args , ** kwargs
548+ )
499549
500550
501551def wrap_assert_any_call (* args : Any , ** kwargs : Any ) -> None :
0 commit comments