我正在尝试对一些遗留代码进行单元测试,这些代码基本上使用QTimer执行一些周期性操作:
class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject* parent = nullptr) : QObject(parent)
{
timer.setInterval(1000);
timer.setSingleShot(false);
timer.start();
connect(&timer, &QTimer::timeout, this, &MyClass::onTimeout);
}
int getValue() const
{
return value;
}
signals:
public slots:
void onTimeout()
{
value++;
}
private:
int value{0};
QTimer timer{this};
};
我需要为onTimeout((方法编写单元测试,因此我试图断开QTimer::timeout与MyClass::onTimeout的连接,并从单元测试中触发更新。
void testFirstUpdate()
{
MyClass myClass;
qDebug() << "disconnect: " << myClass.disconnect(); //returns false
myClass.dumpObjectInfo();
QCOMPARE(myClass.getValue(), 0);
myClass.onTimeout();
QCOMPARE(myClass.getValue(), 1);
}
如何使断开连接工作?或者有更好的方法从QtTestLib控制QTimer吗?添加MyClass::disconnectTimer((是唯一可行的选项吗?
另一种解决方案可能是创建一个新线程并将MyClass移到其中。由于您不会启动新线程,因此不会有事件循环来捕获超时函数。移动myClass将导致计时器重新启动,但由于新线程的事件循环没有运行,因此超时信号永远不会触发。
QThread t;
myClass.moveToThread(&t);
我认为你不能编辑"遗留"代码,将遗留代码重构为可单元测试的将是最好的解决方案。