You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MockerFixture无assert_called_once属性?pytest通过但mypy报错

问题原因及解决方法

这个错误的核心是你把MockerFixture实例和它创建的mock对象搞混了:

  • MockerFixture是pytest-mock提供的fixture,负责创建、管理mock对象,但它本身没有assert_called_once这类断言方法。
  • assert_called_once是unittest.mock.MagicMock(或其他mock类)的方法,只有被补丁后的目标函数/对象才是这类mock实例。

错误代码示例

你可能写出了类似这样的代码:

# test_module.py
import module
from pytest_mock import MockerFixture

def test_main(mocker: MockerFixture):
    mocker.patch("module.func")  # 补丁但没保存返回的mock对象
    module.main()
    mocker.assert_called_once()  # 错误:直接在MockerFixture实例上调用断言方法

正确代码示例

需要捕获mocker.patch返回的mock对象,然后在这个对象上调用断言:

# test_module.py
import module
from pytest_mock import MockerFixture

def test_main(mocker: MockerFixture):
    mock_func = mocker.patch("module.func")  # 保存补丁后的mock对象
    module.main()
    mock_func.assert_called_once()  # 正确:在mock对象上调用断言方法

补充说明

如果使用mocker.patch.object补丁类/实例方法,同样需要捕获返回的mock对象:

def test_something(mocker: MockerFixture):
    mock_method = mocker.patch.object(SomeClass, "some_method")
    SomeClass().some_method()
    mock_method.assert_called_once_with("expected_arg")

内容的提问来源于stack exchange,提问作者Laurent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:54:59