Python 函数monkeypatching中的setattr引发属性错误
我有以下代码Python 函数monkeypatching中的setattr引发属性错误,python,python-3.x,pytest,monkeypatching,Python,Python 3.x,Pytest,Monkeypatching,我有以下代码 /tests/test\u fixme.py def make_my_patch(): name = "Dinesh" return name def test_make_patch(monkeypatch): monkeypatch.setattr(make_my_patch,"name","DineshKumar") 使用setattr设置name会引发属性错误 注意:我将这两个函数放在同一个文件中作为权宜之计解决方案,以避免模块/导入错误 这是
/tests/test\u fixme.py
def make_my_patch():
name = "Dinesh"
return name
def test_make_patch(monkeypatch):
monkeypatch.setattr(make_my_patch,"name","DineshKumar")
使用setattr
设置name
会引发属性错误
注意:我将这两个函数放在同一个文件中作为权宜之计解决方案,以避免模块/导入错误
这是回溯
================================================================== FAILURES ==================================================================
______________________________________________________________ test_make_patch _______________________________________________________________
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7fddd5675630>
def test_make_patch(monkeypatch):
> monkeypatch.setattr(make_my_patch,"name","DineshKumar")
E AttributeError: <function make_my_patch at 0x7fddd5676048> has no attribute 'name'
tests/test_fixme.py:16: AttributeError
========================================================== short test summary info ===========================================================
FAILED tests/test_fixme.py::test_make_patch - AttributeError: <function make_my_patch at 0x7fddd5676048> has no attribute 'name'
============================================================= 1 failed in 0.02s ==============================================================
(testenv) user@user:~/MyGitHub/MyLearning/Python/MyUnitTests/Testing10$
=======================================================================================================================================失败==================================================================
______________________________________________________________测试制作补丁_______________________________________________________________
monkeypatch=
def测试制作补丁(monkeypatch):
>setattr(让我的补丁成为“名字”,“迪内斯库马尔”)
E AttributeError:没有属性“name”
测试/测试修复。py:16:AttributeError
=================================================================================================简短测试摘要信息===========================================================
失败的测试/test\u fixme.py::test\u make\u补丁-AttributeError:没有属性“name”
==============================================================================================1在0.02秒内失败==============================================================
(测试)user@user:~/MyGitHub/MyLearning/Python/MyUnitTests/Testing10$
如何正确地修补name属性?但是,如果我将代码放在一个类中,那么setattr for class变量就可以正常工作了吗?你能解释一下为什么它不适用于函数吗?以防有人来这里 您需要返回一个具有返回值的模拟对象 因此,您的代码将类似于:
from unittest.mock import Mock
def make_my_patch():
name = "Dinesh"
return name
def test_make_patch(monkeypatch):
monkeypatch.setattr(
make_my_patch,
Mock(return_value="DineshKumar")
)
以防有人来这里 您需要返回一个具有返回值的模拟对象 因此,您的代码将类似于:
from unittest.mock import Mock
def make_my_patch():
name = "Dinesh"
return name
def test_make_patch(monkeypatch):
monkeypatch.setattr(
make_my_patch,
Mock(return_value="DineshKumar")
)
请注意,即使要对
name
属性进行monkey修补,函数使用的也是name
局部变量。@MisterMiyagi:那么,我实际上如何对name
变量进行monkey修补,并强制它使用更新后的值呢?你能解释一下为什么这对课堂有效,为什么在这个场景中不起作用。在过去的两天里,我一直在努力理解这一点。该函数需要更改,以便它不使用局部变量。我只能假设您的类使用了一个属性。是的,您是对的。我在使用类时将name
设置为类变量。理想情况下,由于python函数是第一类对象,setattr(make_my_patch,“name”,“DineshKumar”)
工作正常。因此我认为monkeypatch
的setattr
也应该工作:(请注意,即使要对name
属性进行猴子补丁,函数使用的也是name
局部变量。@MisterMiyagi:那么,我实际上如何对name
变量进行monkeypatch,并强制它使用更新后的值呢?请解释为什么这对类有效,为什么在这个场景中不起作用ario.在过去的两天里,我一直在努力理解这一点。需要更改函数,使其不使用局部变量。我只能假设您的类使用了属性。是的,您是对的。我在使用类时将name
设置为类变量。理想情况下,由于python函数是第一类对象,setattr(make_my_patch,“name”,“DineshKumar”)
工作正常。因此我认为monkeypatch
的setattr
也应该工作:(