【问题标题】:Disconnect qt timer for unit test断开 qt 计时器以进行单元测试
【发布时间】:2018-12-03 09:27:37
【问题描述】:

我正在尝试对一些使用 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() 是唯一可行的选择吗?

【问题讨论】:

    标签: c++ qt unit-testing qtimer qttest


    【解决方案1】:

    另一种解决方案可能是创建一个新线程并将 MyClass 移动到它。 由于您不会启动新线程,因此不会有事件循环来捕获超时功能。移动 myClass 将导致计时器重新启动,但由于新线程的事件循环没有运行,所以永远不会触发超时信号。

    QThread t;
    myClass.moveToThread(&t);
    

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

    【讨论】:

    • 我喜欢移动到线程的想法。由于计时器是私人的,因此无法断开连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    相关资源
    最近更新 更多