Отключить 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(), поэтому я пытаюсь отключить 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 ответ
Альтернативным решением может быть создание нового потока и перемещение в него MyClass. Так как вы не запустите новый поток, не будет никакого цикла событий, чтобы перехватить функцию тайм-аута. Перемещение myClass вызовет перезапуск таймера, но, поскольку цикл обработки событий нового потока не выполняется, сигнал тайм-аута никогда не сработает.
QThread t;
myClass.moveToThread(&t);
Я полагаю, что вы не можете редактировать "устаревший" код, поэтому лучшим решением будет рефакторинг устаревшего кода для проверки его на модульность.