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
也应该工作:(