使用 Pytest monkeypatch 更改夹具对象属性时出现 AttributeError
AttributeError when using Pytest monkeypatch to change fixture object attribute
在我的 pytest 文件 test_foo.py
中,我试图使用 monkeypatch
将 foo.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
在我的 pytest 文件 test_foo.py
中,我试图使用 monkeypatch
将 foo.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