Внедрение имитации QTimer - PullRequest
1 голос
/ 09 июля 2020

Я пишу модульный тест с QTest для устаревшего кода, например:

#include <QTimer>
class MyObject: public QObject{
    public:
        void foo(){
            t1.start(500);
        }
    private:
        QTimer t1{this};
};

И хочу имитировать QTimer, а затем проверить, правильно ли вызывается QTimer::start(int). Я пробовал несколько подходов. Внедрение зависимостей с помощью шаблона template<typename TIMER = QTimer> class MyObjecr: public QObject, но получение

Классы шаблонов, не поддерживаемые Q_OBJECT

И LD_PRELOAD = libQTimerMock.so с простой повторной реализацией QTimer.

class QTimer : public QObject
{
signals: 
    void onStarted(int);
public slots:
    void start(int i)
    {
        emit onStarted(i);
    }
};

Что с QMetaObject mag ie на самом деле РАБОТАЕТ .

Есть ли более простой способ? Некоторое время компиляции включает инъекцию? Итак, #include <QTimer> для MyObject.h использует фиктивный файл, а остальная часть спагетти остается неизменной?

...