c++ - 断开 qt 计时器以进行单元测试
问题描述
我正在尝试对一些使用 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() 方法编写单元测试,因此我试图从 MyClass::onTimeout 断开 QTimer::timeout 并从单元测试触发更新。
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);
我认为您无法编辑“遗留”代码,将遗留代码重构为可单元测试将是最好的解决方案。
推荐阅读
- facebook - 如何使用 Facebook 唯一号码获取用户的电子邮件地址?
- java - 如何从作为 lambda 传递的功能接口对象的实例中获取参数?
- regex - 满足特定条件时使用 bash 脚本中的 if 语句删除文件
- java - 无法从我与 android studio 中 Volley 的链接中获取 json
- binding - 如何翻译视图中的绑定?
- c - 从另一个线程取消 nanosleep()
- python - SQLAlchemy 2 外键
- firebase - 有没有办法创建 Auth 对象并使用该 UID 来创建带有 GeoFirestore 的文档
- postman - 使用 Postman 测试 OAuth 身份验证代码流
- python - 矢量化 softmax 梯度