gpt4 book ai didi

python - 无法正确修补对象的属性

转载 作者:行者123 更新时间:2023-12-01 07:32:23 27 4
gpt4 key购买 nike

我有一个Python模块,如下:

# src/exec.py

class A:

def run(self, stuff):
b = B(stuff.x)

class B:
def __init__(self, x):
self.obj = self.create_some_obj()

我正在尝试测试类(class)的一部分 A独立地,我需要替换 objB与一个假物体。我这样做如下:

# test/test_execs.py

import exec as ex

class FakeObjForB:
def __init__(self):
# some init

class TestClass:

@patch.object(ex.B, 'obj', FakeObjForB())
def test_with_fake_obj(self):
a = ex.A()
a.run()
# assert something about the state of a that depends on the b inside its run method

运行此测试会出现错误:AttributeError: <class 'B'> does not have the attribute 'obj' 。我尝试用 @patch 替换该行装饰器 @patch.object(ex.B, 'obj', FakeObjForB(), create=True) 。然而,这会导致 b.obj使用实际定义,而不是 FakeObjForB ,这又导致 test_with_fake_obj 中的断言错误失败。 。关于我在这里做错了什么的任何线索吗?

最佳答案

在您的示例中,您正在修补 B 类,这是作为第一个参数传递的对象。该类未在类级别声明 obj 属性,因此会引发 AttributeError 。当您提供 create=True 时,它不会提示,因为该参数允许在需要/访问时动态创建 obj 属性。但是,这种情况永远不会发生,因为该属性的第一个“访问”是它的实际创建 - 没有发生动态模拟。

解决方案是实际修补其返回值将分配给 obj 属性的方法,例如:

@patch.object(ex.B, 'create_some_obj', FakeObjForB())

关于python - 无法正确修补对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57154996/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com