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

尝试模拟类方法局部变量x触发AttributeError,如何解决?

如何用pytest-mocker模拟方法内的局部变量?

你遇到的问题是无法直接通过mocker.patch访问函数内部的局部变量——局部变量仅在函数执行时存在于栈帧中,不属于函数对象的属性,所以mocker.patch("myapp.tests.test_mocker.Command.run.x", "bar")会抛出AttributeError。

以下是两种可行的解决方式:

方案1:重构代码,抽离局部变量的赋值逻辑

把局部变量x的生成逻辑拆成独立的辅助方法,这样就能通过patch这个方法来修改x的值:

import pytest

class Command():
    def _get_x_value(self):
        # 抽离x的赋值逻辑
        return "foo"
    
    def run(self):
        x = self._get_x_value()
        return x

def test_command_run(mocker):
    # patch辅助方法,返回"bar"
    mocker.patch.object(Command, "_get_x_value", return_value="bar")
    c = Command()
    assert c.run() == "bar"

方案2:直接替换目标方法的实现

如果不想重构代码,可以直接替换run方法的逻辑,返回预期的结果:

import pytest

class Command():
    def run(self):
        x = "foo"
        return x

def test_command_run(mocker):
    # 定义mock的run方法
    def mock_run(self):
        x = "bar"
        return x
    
    # patch原run方法
    mocker.patch.object(Command, "run", side_effect=mock_run)
    c = Command()
    assert c.run() == "bar"

补充说明

如果x的值是从外部依赖(比如配置、其他函数)获取的,优先patch那个外部依赖,这比直接替换方法实现更符合测试的隔离原则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:57:11