]> granicus.if.org Git - python/commitdiff
bpo-38122: minor fixes to AsyncMock spec handling (GH-16099)
authorMichael Foord <voidspace@users.noreply.github.com>
Fri, 13 Sep 2019 16:40:56 +0000 (18:40 +0200)
committerStéphane Wirtel <stephane@wirtel.be>
Fri, 13 Sep 2019 16:40:56 +0000 (17:40 +0100)
Lib/unittest/mock.py

index 513cd5c924d4e75fe2eea958f63a7f33dd2ee211..b33d58a2cb0df2d180697761c3c5270ecb2fe63d 100644 (file)
@@ -402,18 +402,12 @@ class NonCallableMock(Base):
         # so we can create magic methods on the
         # class without stomping on other mocks
         bases = (cls,)
-        if not issubclass(cls, AsyncMock):
+        if not issubclass(cls, AsyncMockMixin):
             # Check if spec is an async object or function
-            sig = inspect.signature(NonCallableMock.__init__)
-            bound_args = sig.bind_partial(cls, *args, **kw).arguments
-            spec_arg = [
-                arg for arg in bound_args.keys()
-                if arg.startswith('spec')
-            ]
-            if spec_arg:
-                # what if spec_set is different than spec?
-                if _is_async_obj(bound_args[spec_arg[0]]):
-                    bases = (AsyncMockMixin, cls,)
+            bound_args = _MOCK_SIG.bind_partial(cls, *args, **kw).arguments
+            spec_arg = bound_args.get('spec_set', bound_args.get('spec'))
+            if spec_arg and _is_async_obj(spec_arg):
+                bases = (AsyncMockMixin, cls)
         new = type(cls.__name__, bases, {'__doc__': cls.__doc__})
         instance = object.__new__(new)
         return instance
@@ -1020,6 +1014,9 @@ class NonCallableMock(Base):
         return f"\n{prefix}: {safe_repr(self.mock_calls)}."
 
 
+_MOCK_SIG = inspect.signature(NonCallableMock.__init__)
+
+
 class _AnyComparer(list):
     """A list which checks if it contains a call which may have an
     argument of ANY, flipping the components of item and self from