使用 Pytest monkeypatch 更改夹具对象属性时出现 AttributeError

AttributeError when using Pytest monkeypatch to change fixture object attribute

在我的 pytest 文件 test_foo.py 中,我试图使用 monkeypatchfoo.path 的值更改为 mock_path。但是,当我尝试以下操作时,出现错误

ERROR test_foo.py::test_foo - AttributeError: 'foo' has no attribute 'path'

进行此更改的正确方法应该是什么,以便 test_foo 中的 foo 对象将使用 mock_path 并通过该测试?

test_foo.py:

import os
import pytest


class Foo:
    def __init__(self):
        self.path = os.path.join(os.getcwd(), "test.txt")
        
@pytest.fixture
def foo(monkeypatch):
    monkeypatch.setattr(Foo, 'path', 'mock_path')
    return Foo()

def test_foo(foo):
    assert foo.path == "mock_path"

您正在尝试更改 class 而不是 class 实例的属性,因此错误消息来自 monkeypath.setattr - Foo 确实没有属性path,因为这是一个实例变量。

要解决此问题,请改为修补 class 实例:

@pytest.fixture
def foo(monkeypatch):
    inst = Foo()
    monkeypatch.setattr(inst, 'path', 'mock_path')
    return inst