Отключить таймер - PullRequest
       45

Отключить таймер

0 голосов
/ 03 декабря 2018

Я пытаюсь выполнить модульное тестирование некоторого устаревшего кода, который использует 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);
}

Как мне сделать отключение работающим?Или есть лучший способ управления QTimer из QtTestLib?Является ли добавление MyClass :: disconnectTimer () единственно возможным вариантом?

1 Ответ

0 голосов
/ 04 декабря 2018

Альтернативным решением может быть создание нового потока и перемещение в него MyClass.Так как вы не запустите новый поток, не будет никакого цикла событий, чтобы перехватить функцию тайм-аута.Перемещение myClass вызовет перезапуск таймера, но поскольку цикл обработки событий нового потока не выполняется, сигнал тайм-аута никогда не сработает.

QThread t;
myClass.moveToThread(&t);

Я полагаю, что вы не можете редактировать «устаревший» код, рефакторингунаследованный код, подлежащий тестированию на модуле, будет лучшим решением.

...