New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
asyncio.iscoroutinefunction returns unexpected results when presented with unittest.mock.Mock #69785
Comments
>>> asyncio.iscoroutinefunction(unittest.mock.Mock())
<Mock name='mock._is_coroutine' id='4544068072'> This is an unexpected response, both in type (Mock rather than boolean) and value (truthy). inspect.iscoroutinefunction behaves as expected. Workaround: >>> m = unittest.mock.Mock()
>>> m._is_coroutine = False
>>> asyncio.iscoroutinefunction(m)
False |
Hm... I don't know what answer you would expect. Who says your mock shouldn't behave like a coroutine? In general, passing mocks to functions is likely to return a mock -- even boolean functions. Can you provide more context? |
>>> asyncio.iscoroutinefunction(unittest.mock.Mock())
<Mock name='mock._is_coroutine' id='4544068072'> Yeah, I already had this issue when I wrote unit tests using mock :-/ I didn't find an obvious fix for this issue, and it's quite easy to workaround it. It looks like the "m._is_coroutine = False" is not used in asyncio tests. I don't recall how I worked around the issue in asyncio tests... |
For me, the context is a test I was writing that went something like this: >>> import asyncio
>>> from unittest.mock import Mock
>>> loop = asyncio.get_event_loop()
>>> blocking_func = Mock()
>>> loop.run_in_executor(None, blocking_func)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python3/3.5.0/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/base_events.py", line 497, in run_in_executor
raise TypeError("coroutines cannot be used with run_in_executor()")
TypeError: coroutines cannot be used with run_in_executor() I understand that the nature of Mock makes its behaviors ambiguous. However, there are a few reasons I think asyncio.iscoroutinefunction(Mock()) should be false:
|
OK, I concede your point. It shouldn't be too hard to make |
Oh dang. We were waiting for the OP to submit a patch (not very complex) On Tue, Dec 22, 2015 at 12:30 AM, Joseph Gordon <report@bugs.python.org>
|
Did you mean 3.5.1? Or Larry is going to rush 3.5.2 soon? |
No I just misremembered. --Guido (mobile) |
I uploaded a patch that appears to fix the issue. |
I guess the inconsistency in original report is fixed with bpo-28703 where both inspect.iscoroutinefunction and asyncio.iscoroutinefunction return False for Mock(). The fix is available from 3.5.3 . There is also async support for mock added in 3.8 with bpo-26467. I am closing this as part of triaging. Feel free to reopen this if I am missing something. Thanks. # Python 3.5 python3.5
Python 3.5.2 (default, Nov 12 2018, 13:43:14)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> from unittest.mock import *
>>> asyncio.iscoroutinefunction(Mock())
<Mock name='mock._is_coroutine' id='140563339256496'> # Master ./python.exe
Python 3.9.0a0 (heads/master:daf6262751, Jun 12 2019, 23:12:37)
[Clang 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from unittest.mock import Mock
>>> import asyncio, inspect
>>> inspect.iscoroutinefunction(Mock())
False
>>> asyncio.iscoroutinefunction(Mock())
False |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: