【问题标题】:How to test that an object is created by another?如何测试一个对象是由另一个对象创建的?
【发布时间】:2021-10-19 16:10:39
【问题描述】:

我有一个来自A 类的对象,它使用实例方法从B 类创建另一个对象。我想用attribute_to_checkpytest 中的True 值来测试它是否正确创建

class B:
    def __init__(self, attribute_to_check=None):
        self.attribute_to_check = attribute_to_check or False
    
    def some_method():
        # some actions...

class A:
    def __init__(self, some_attr):
        self.some_attr = some_attr
        ...

    async def create_object_b(self, something_not_relevant):
       ...
       object_b = B(attribute_to_check=True)
       object_b.some_method()
       ...
       return None

编辑:上面的方法不返回object_b,而是使用它的方法。

测试会是这样的:

async def test_object_created():
    object_A = A(some_attrs)
    await object_A.create_object_b(something_not_relevant="")
    # How can I access and assert object B is created with attribute_to_check == True?

我尝试为 B 类的对象创建一个夹具,但这不会测试我的意图,即来自 A 类的函数实例化 B 类的对象,其预期值为属性。

【问题讨论】:

  • 你的方法A.create_object_b应该是创建一个B类型的对象,然后返回,对吧?
  • 不,我认为这就是它的棘手之处。它实例化一个B 类的对象来使用它的方法。但在这种情况下,我检查它实例化的实际属性很重要。我将把它添加到问题中,谢谢@RafaelDouradoD
  • 方法返回的是object_b吗?如果不是,你为什么要测试它?
  • @danielsto,如果是这种情况,那么我建议您在A 中创建一个仅创建此对象B 的方法,而不是另一种处理B 方法的方法。另外,根据您的代码,很明显B 是使用attribute_to_check=True 创建的,无需对其进行测试
  • 此外,在执行object_b = B(attribute_to_check=True) 时,由于您在B 的构造函数中执行self.attribute_to_check = attribute_to_check or False,因此object_b 必须 具有attribute_to_check == True。请注意,如果您只是将默认值设置为False 而不是None,那么分配给self.attribute_to_checkor False 是多余的。 X or False 始终是 X

标签: python testing pytest


【解决方案1】:

我建议您重构您的方法 create_object_b 以仅创建 b 对象(与方法名称和方法行为一致)。这样你就可以检查 B 是否是用你想要的属性创建的

class B:
    def __init__(self, attribute_to_check=None):
        self.attribute_to_check = attribute_to_check or False

    def some_method():
        # some actions...

class A:
    def __init__(self, some_attr):
        self.some_attr = some_attr
        ...

    async def create_object_b(self, something_not_relevant) -> B:
        ...
        object_b = B(attribute_to_check=True)
        ...
        return object_b

    async def make something_with_b(self, object_b: B):
        b.some_method()

测试类

async def test_object_created():
    object_A = A(some_attrs)
    object_b = await object_A.create_object_b(something_not_relevant="")

    assert object_b.some_attribute == True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    相关资源
    最近更新 更多