尝试模拟类方法局部变量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
相关产品推荐
相关产品推荐

