[issue41628] All unittest.mock autospec-generated methods are coroutine functions

2020-08-24 Thread Tom Most


Tom Most  added the comment:

Note that this can interact poorly with AsyncMock, introduced in Python 3.8, 
because it causes a mock generated from a mock produces an object with async 
methods rather than regular ones. In Python 3.7 chaining mocks like this would 
produce regular methods. (This is how I discovered this issue.)

--

___
Python tracker 
<https://bugs.python.org/issue41628>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue41628] All unittest.mock autospec-generated methods are coroutine functions

2020-08-24 Thread Tom Most


New submission from Tom Most :

Given a class:

class Foo:
def bar(self):
pass

And an autospec'd mock of it:

foo_mock = mock.create_autospec(spec=Foo)

The result of `asyncio.iscoroutinefunction()` differs:

asyncio.iscoroutinefunction(Foo.bar)# -> False
asyncio.iscoroutinefunction(foo_mock.bar)   # -> True

This behavior is the same on Python 3.7 and 3.8.

I've attached a demonstration script, repro4.py. Here is the output on Python 
3.7.9:

$ python3.7 repro4.py 
baz is a coroutine function?False
Foo.bar is a coroutine function?False
foo_instance.bar is a coroutine function?   False
baz_mock is a coroutine function?   False
foo_mock.bar is a coroutine function?   True
foo_mock_instance.bar is a coroutine function?  True
foo_mock_mock.bar is a coroutine function?  False
foo_mock_mock_instance.bar is a coroutine function? False
foo_mock_instance.bar()  ->  
foo_mock_mock_instance.bar() ->  

And on Python 3.8.2:

python3.8 repro4.py 
baz is a coroutine function?False
Foo.bar is a coroutine function?False
foo_instance.bar is a coroutine function?   False
baz_mock is a coroutine function?   False
foo_mock.bar is a coroutine function?   True
foo_mock_instance.bar is a coroutine function?  True
foo_mock_mock.bar is a coroutine function?  True
foo_mock_mock_instance.bar is a coroutine function? False
foo_mock_instance.bar()  ->  
foo_mock_mock_instance.bar() ->  

--
components: Library (Lib)
files: repro4.py
messages: 375862
nosy: twm
priority: normal
severity: normal
status: open
title: All unittest.mock autospec-generated methods are coroutine functions
type: behavior
versions: Python 3.7, Python 3.8
Added file: https://bugs.python.org/file49425/repro4.py

___
Python tracker 
<https://bugs.python.org/issue41628>
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com