如何验证被测代码创建的未知对象何时按预期方式被调用pytestunittest

问题描述

我有一些代码可以从传递给它的类列表中创建实例。这不能更改,因为传递给它的类的列表被设计为动态的,并在运行时通过配置文件进行选择)。这些类的初始化必须由被测代码完成,因为它取决于仅被测代码知道如何控制的因素(即,它将设置特定的初始化参数)。我已经通过运行它并通过大量输出手动进行拖拽来对代码进行了广泛的测试。显然,我已经证明了自己的概念,现在我需要添加一些适当的单元测试。以下示例演示了我要测试的内容:

我想测试下面定义的run类的Foo方法:

# foo.py
class Foo:

    def __init__(self,stuff):
        self._stuff = stuff

    def run():
        for thing in self._stuff:
            stuff = stuff()
            stuff.run()

其中一个(或多个)文件包含要运行的东西的类定义,例如:

# classes.py

class Abc:
    def run(self): 
        print("Abc.run()",self)

class Ced:
    def run(self): 
        print("Ced.run()",self)

class Def:
    def run(self): 
        print("Def.run()",self)

最后,是一个如何结合在一起的示例:

>>> from foo import Foo
>>> from classes import Abc,Ced,Def
>>> f = Foo([Abc,Def])
>>> f.run()
Abc.run() <__main__.Abc object at 0x7f7469f9f9a0>
Ced.run() <__main__.Abc object at 0x7f7469f9f9a1>
Def.run() <__main__.Abc object at 0x7f7469f9f9a2>

要运行的东西的列表定义了对象类( NOT 实例),因为这些实例的寿命很短;它们是由Foo.run()和 die 在功能完成时(或更确切地说,不久之后的某个时间)创建的。但是,我发现想出一种清晰的方法来测试此代码非常棘手。

我想证明要运行的东西列表中每个类的run方法已被调用。但是,从测试来看,我对Abc方法创建的run实例没有了解,因此,如何对其进行验证?我无法修补导入,因为受测试的代码未明确导入该类(毕竟,它并不关心它是什么类)。例如:

# test.py
from foo import Foo

class FakeStuff:
    def run(self):
        self.run_called = True

def test_foo_runs_all_stuff():
    under_test = Foo([FakeStuff])
    under_test.run()
    # How to verify that FakeStuff.run() was called?
    assert <SOMETHING>.run_called,"FakeStuff.run() was not called"

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)