首页 > 解决方案 > 函数的monkeypatching中的setattr抛出属性错误

问题描述

我有以下代码

/tests/test_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$ 

如何正确修补名称属性?但是,如果我将代码放在一个类中,类变量的 setattr 就可以正常工作吗?您能否解释一下为什么它不适用于功能?

标签: pythonpython-3.xpytestmonkeypatching

解决方案


万一有人在这里结束。

您需要返回一个具有返回值的模拟对象,因此您的代码将类似于:

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")
    )

推荐阅读