繁体   English   中英

断开qt计时器进行单元测试

[英]Disconnect qt timer for unit test

我正在尝试对一些旧代码进行单元测试,这些代码基本上使用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);

我认为您不能编辑“旧版”代码,将遗留代码重构为可单元测试将是最好的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM