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

如何验证Foo构造函数调用Bar构造函数并验证obj赋值?

问题分析与解决

你遇到的问题核心是Mock对象的层级搞混了:

  • mock_bar 是被patch后的Bar类本身的Mock对象(对应代码里的Bar)
  • 而调用Bar(1)时,返回的是mock_bar.return_value——这是Mock类被调用后生成的实例对象(对应代码里的Bar(1)执行结果)

所以你的断言拿result.obj(Bar(1)的返回值)和mock_bar(Bar类的Mock)比较,自然不相等。

修正后的测试代码

import pytest
from unittest.mock import patch
from mod import Foo, Bar

@pytest.fixture
def mock_bar():
    with patch('mod.Bar') as mock:
        yield mock

def test_foo(mock_bar):
    result = Foo()
    # 验证Bar类被以参数1调用过一次
    mock_bar.assert_called_once_with(1)
    # 验证obj是Bar()调用后的返回值,即mock_bar的return_value
    assert result.obj == mock_bar.return_value

补充说明

  • 用patch替换Bar类后,所有对Bar()的调用都会返回mock_bar.return_value(默认是一个新的MagicMock实例)
  • 如果你想自定义Bar()返回的对象,可以在测试里给mock_bar.return_value赋值,比如mock_bar.return_value = Mock()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:04:55