控制QTimer的时间? 我正在考虑用C++和Qt重写一些现有的C代码。在C代码中,poll用于检查来自多个源的输入,每个源都有一个超时值和一些与之相关的特定行为。比如说 在intput0上沉默5分钟后,我们假设对方已经死亡,我们试图重新建立联系 我们希望客户端连接到socket0 一旦客户机连接到socket0调用accept(socket1),客户机在关闭socket1之前有一分钟时间发出请求

控制QTimer的时间? 我正在考虑用C++和Qt重写一些现有的C代码。在C代码中,poll用于检查来自多个源的输入,每个源都有一个超时值和一些与之相关的特定行为。比如说 在intput0上沉默5分钟后,我们假设对方已经死亡,我们试图重新建立联系 我们希望客户端连接到socket0 一旦客户机连接到socket0调用accept(socket1),客户机在关闭socket1之前有一分钟时间发出请求,c++,qt,testing,time,C++,Qt,Testing,Time,这类事情不是很难测试,通过使用LD_PRELOAD和“隐藏”相关的系统功能(poll,gettimeofday),可以(稍微)轻松地控制时间流逝并触发超时 转到Qt时,我计划在QSocketNotifier实例中包装文件描述符,并将激活(int)信号连接到合适的插槽。这基本上提供了一个Qt风格的轮询——除非没有超时 对于超时,我正在考虑将QTimer耦合到每个QSocketNotifier。我的实验表明这是可行的,而且相当优雅。然而,测试并不愉快。我真的不能让测试坐等5分钟等待超时 如何使此解决

这类事情不是很难测试,通过使用
LD_PRELOAD
和“隐藏”相关的系统功能(
poll
gettimeofday
),可以(稍微)轻松地控制时间流逝并触发超时

转到Qt时,我计划在
QSocketNotifier
实例中包装文件描述符,并将
激活(int)
信号连接到合适的插槽。这基本上提供了一个Qt风格的
轮询
——除非没有超时

对于超时,我正在考虑将
QTimer
耦合到每个
QSocketNotifier
。我的实验表明这是可行的,而且相当优雅。然而,测试并不愉快。我真的不能让测试坐等5分钟等待超时

如何使此解决方案中的超时可测试


(或者我只是想错了,应该做些完全不同的事情。)

我相信这个问题可以解释为“如何模拟
QTimer
?”这个重新编写的问题的答案是“间接”。你可以在
QTimer
上抽象编写主程序,然后,测试代码会模拟它,根据测试需求而不是时间发出信号


实现这一点的一种特殊方法是,测试代码断开插槽与
QTimer
信号的连接,并将其自身的信号连接到位。

您不能将超时作为变量,并在单元测试之前将其设置为较低的值吗?我删除了“单元”一词,因为它不是真正的“单元测试”。我可以减少超时时间,但这不是我通常尝试进行测试的方式。我宁愿控制环境,在这种情况下是时间,让事情按照预期进行测试。在这个特殊的例子中,我还想在集成测试中测试超时(我们有几个进程在通信),更改超时值有更多的含义。我不知道不在那里等5分钟怎么办。尤其是Qt。如果您有自己的时间度量框架,您可以在其中实现一个功能,提前5分钟“设置”时间,但我发现,如果您想使用多个进程进行测试,而这些进程在时间上相互依赖,那么这也会产生问题。(+AFAIK你不能用Qt来做这件事)。是的,标准的OO方法是通过依赖注入实现控制反转。这种方法在使用命名类型的语言中也有点麻烦。我真的希望
QTimer
可以通过其他方式进行测试。@Magnus决定您要测试什么。你想测试你对信号的反应吗?然后从其他东西发出信号。是否要测试您对
QTimer
的反应?然后您将被困在
QTimer
上。好吧,我想测试对信号的反应,但是只有
QTimer
实例的信号连接到插槽,所以它们几乎相同。请注意,我这里所说的不仅仅是“单元测试”(其中“单元”是一个类)。@Magnus仍然可以从涉及的类外部连接/断开Qt的信号和插槽,因此您应该能够将所有内容重新连接到模拟计时器以进行测试,也许甚至不需要修改生产代码。我的意思是,对于集成测试来说,等待5分钟似乎是合理的。只需将它们自动化,让它们定期在某个地方运行,并在出现问题时收到电子邮件通知。所以你不必“积极地”等待。但是如果Qt测试框架能够提供一些“时间变化”功能,那就太好了