@@ -402,18 +402,12 @@ def __new__(cls, /, *args, **kw):
402
402
# so we can create magic methods on the
403
403
# class without stomping on other mocks
404
404
bases = (cls ,)
405
- if not issubclass (cls , AsyncMock ):
405
+ if not issubclass (cls , AsyncMockMixin ):
406
406
# Check if spec is an async object or function
407
- sig = inspect .signature (NonCallableMock .__init__ )
408
- bound_args = sig .bind_partial (cls , * args , ** kw ).arguments
409
- spec_arg = [
410
- arg for arg in bound_args .keys ()
411
- if arg .startswith ('spec' )
412
- ]
413
- if spec_arg :
414
- # what if spec_set is different than spec?
415
- if _is_async_obj (bound_args [spec_arg [0 ]]):
416
- bases = (AsyncMockMixin , cls ,)
407
+ bound_args = _MOCK_SIG .bind_partial (cls , * args , ** kw ).arguments
408
+ spec_arg = bound_args .get ('spec_set' , bound_args .get ('spec' ))
409
+ if spec_arg and _is_async_obj (spec_arg ):
410
+ bases = (AsyncMockMixin , cls )
417
411
new = type (cls .__name__ , bases , {'__doc__' : cls .__doc__ })
418
412
instance = object .__new__ (new )
419
413
return instance
@@ -1019,6 +1013,25 @@ def _calls_repr(self, prefix="Calls"):
1019
1013
return f"\n { prefix } : { safe_repr (self .mock_calls )} ."
1020
1014
1021
1015
1016
+ _MOCK_SIG = inspect .signature (NonCallableMock .__init__ )
1017
+
1018
+
1019
+ class _AnyComparer (list ):
1020
+ """A list which checks if it contains a call which may have an
1021
+ argument of ANY, flipping the components of item and self from
1022
+ their traditional locations so that ANY is guaranteed to be on
1023
+ the left."""
1024
+ def __contains__ (self , item ):
1025
+ for _call in self :
1026
+ if len (item ) != len (_call ):
1027
+ continue
1028
+ if all ([
1029
+ expected == actual
1030
+ for expected , actual in zip (item , _call )
1031
+ ]):
1032
+ return True
1033
+ return False
1034
+
1022
1035
1023
1036
def _try_iter (obj ):
1024
1037
if obj is None :
0 commit comments