这里有一个从一些PyTest单元测试中截取的例子,这些测试永远不会退出.如果我在DataListener.__init__上插入一个断点,我会看到它被test_Control.py中的from controller import Controller语句调用,这对我来说有点奇怪;为什么从模块导入一个类会实例化它的一个实例?

Date_listener.py

class DataListener:

    def __init__(self, port, host='localhost'):
        self._stop_monitor = Event()
        self._monitor = Thread(target=self.check_last_message)
        self._monitor.start()

    def __del__(self):
        self.stop()

    def stop(self):
        self._stop_monitor.set()
        self._monitor.join()

    def check_last_message(self):
        while not self._stop_monitor.is_set():
            # Code to check for a heartbeat here
            pass

Control.py

from data_listener import DataListener

class Controller:
    def __init__(
        self,
        subscriber=DataListener(port=DEFAULT_SUBSCRIBER_PORT),
        publisher=JsonPublisher(DEFAULT_PUBLISHER_PORT)):

        pass

test_Control.py

from controller import Controller

def test_controller_work_loop():
    # ARRANGE
    controller = Controller(subscriber=None, publisher=None)

    # Some actual tests here
    # This test passes and finishes but the test suite never exits

推荐答案

默认参数在加载类时计算.

from data_listener import DataListener

class Controller:
    def __init__(
        self,
        subscriber=DataListener(port=DEFAULT_SUBSCRIBER_PORT),  # These are run!
        publisher=JsonPublisher(DEFAULT_PUBLISHER_PORT)):

        pass

您需要更新您的Controller类,以便在初始化器中延迟初始化它们

from data_listener import DataListener

class Controller:
    def __init__(self, subscriber=None, publisher=None):
        self.subscriber = subscriber or DataListener(port=DEFAULT_SUBSCRIBER_PORT)
        self.publisher = publisher or JsonPublisher(DEFAULT_PUBLISHER_PORT)

Python相关问答推荐

如何使用scipy从频谱图中回归多个高斯峰?

Pandas 第二小值有条件

根据不同列的值在收件箱中移动数据

将输入管道传输到正在运行的Python脚本中

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

当独立的网络调用不应该互相阻塞时,'

ThreadPoolExecutor和单个线程的超时

Pandas—在数据透视表中占总数的百分比

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

Python逻辑操作作为Pandas中的条件

如何从列表框中 Select 而不出错?

如何使regex代码只适用于空的目标单元格

使用Python查找、替换和调整PDF中的图像'

Python Pandas—时间序列—时间戳缺失时间精确在00:00

合并与拼接并举

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

我如何处理超类和子类的情况

是否需要依赖反转来确保呼叫方和被呼叫方之间的分离?

迭代工具组合不会输出大于3的序列

将Pandas DataFrame中的列名的长文本打断/换行为_STRING输出?