python / python/cpython

Patched async function not registering calls until coroutine is awaited

未关闭
#137,594 5 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

stdlib type-bug
主要语言
Python
星标
77.2k
派生
35.9k
PR 合并指标
PR 指标待抓取

描述

Bug report

Bug description:

When using autospec=True the patched async function only has calls registered after the coroutine is awaited. This behavior started happening after I upgraded from 3.12 to 3.13.6.

Code to reproduce

File tests/other_module.py

async def a(value):
    return value * 2

File tests/test_1.py

from unittest.mock import patch

import pytest

import other_module

pytestmark = pytest.mark.asyncio(loop_scope="session")

def b(value):
    return other_module.a(value)


async def test_1():
    with patch.object(other_module, "a", side_effect=other_module.a, autospec=True) as a_mock:
        result = b(10)

        assert not a_mock.called  # This should be True because 'a' was called, but it's False

        await result
        assert a_mock.called  # Now it's True
CPython versions tested on:

3.13

Operating systems tested on:

Linux

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

使用 tests/other_module.py 和 tests/test_1.py 重现该行为,重点关注带有 side_effect 和 autospec=True 的 patch.object。检查 mock 在 coroutine 创建和 await 方面的哪个时点记录调用。完成的标准是:第一个断言在 await 之前通过,并且该行为由适当的 CPython 测试覆盖。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
testing-qa
Issue 类型
缺陷
难度
3/5
预计耗时
1-2 天
活跃度
停滞
描述清晰度
描述清楚
新手友好度
48/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。