New submission from Daniel Andersson <daniel.4nders...@gmail.com>:

Dear maintainers,

I discovered an unexpected behavior when the `side_effect` of an `AsyncMock` 
includes an exception. The test case below fails but I expected it to pass:

```
import sys
import unittest
from unittest.mock import AsyncMock


class A:
    async def foobar(self):
        while True:
            try:
                return await self.mock()
            except Exception:
                continue


class TestA(unittest.IsolatedAsyncioTestCase):
    async def test_refcount(self):
        a = A()
        a.mock = AsyncMock(side_effect=[Exception(), None])
        refc = sys.getrefcount(a)
        await a.foobar()
        self.assertEqual(refc, sys.getrefcount(a))


if __name__ == "__main__":
    unittest.main()
```

If `side_effect=[Exception(), None]` is changed to `side_effect=[None, None]` 
the test case pass.

I discovered this in a bigger codebase while debugging why a weakref.finalize 
did not trigger as expected.

----------
components: asyncio
messages: 395752
nosy: asvetlov, penlect, yselivanov
priority: normal
severity: normal
status: open
title: Exception in AsyncMock side_effect cases incorrect refcount
type: behavior
versions: Python 3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue44410>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to