Используйте QSignalSpy с Microsoft::VisualStudio::CppUnitTestFramework

Я хочу проверить, правильно ли класс Qt излучает сигнал при вызове функции, используя . Я использую MS VisualStudio и используюMicrosoft::VisualStudio::CppUnitTestFramework. Выполнение модульных тестов обычно работает нормально, но создание экземпляра дает довольно общий результат.Failed to set up the execution context to run the testошибка, которая препятствует выполнению всех модульных тестов. Хотя компиляция работает нормально.

Это (упрощенный) класс, который я хочу протестировать:

      // simcam.h
#include <QtCore>

class SimCam {
    Q_OBJECT

public:
    SimCam() {};
    ~SimCam();

public slots:
    void connect() {
        emit(s_connected());
    };

signals:
    void s_connected();
};

и модульный тест:

      #include "CppUnitTest.h"

#include "simcam.h"

#include <QSignalSpy>

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace devices_cameras_simcam_UnitTests {
    TEST_CLASS(ConnectionTests) {
public:

    TEST_METHOD(connectTest) {
        auto simcam = SimCam();

        // Problematic line
        QSignalSpy spy(&simcam, &SimCam::s_connected);

        simcam.connect();
        spy.wait();

        Assert::AreEqual(1, (int)spy.count());
    }
    };
}

Я немного потерялся, как заставить его работать или отладить. Я не нашел подсказки, как использоватьQSignalSpyв сочетании с VisualStudio.

1 ответ

В основном с вызовомspy.wait();(а также другие функцииQSignalSpyкак вы выяснили в ходе тестирования) вы запрашиваете запуск цикла событий, это означает, что это необходимо.

В других средах тестирования это означает предоставление собственной функции и создание ее экземпляра.QApplicationилиQCoreApplication.

Проблема в том, чтоCppUnitTestFrameworkиспользует динамические библиотеки в качестве наборов тестов, которые загружаются каким-то фиксированным инструментом, поэтому теперь у вас есть доступ кmainфункция.

Единственный вариант — использовать инициализацию модуля (вся тестовая dll). Я бы попробовал это (не проверял, но должен решить проблему):

      #include "CppUnitTest.h"
#include <QCoreApplication>
#include <memory>

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

static std::unique_ptr<QCoreApplication> myTestApplicationInstance;

TEST_MODULE_INITIALIZE(ModuleInitialize)
{
    static int argc = 1;
    static char testName[64] = "testSuiteName";
    static char *argv[2] = { testName, nullptr };

    myTestApplicationInstance = std::make_unique<QCoreApplication>(argc, argv);
}

TEST_MODULE_CLEANUP(ModuleCleanup)
{
    myTestApplicationInstance.reset();
}

Документация API Microsoft.VisualStudio.TestTools.CppUnitTestFramework

Тестовые модули

       TEST_MODULE_INITIALIZE(methodName)
{
    // module initialization code
}

Определяет метод MethodName , который запускается при загрузке модуля.TEST_MODULE_INITIALIZEможет быть определен только один раз в тестовом модуле и должен быть объявлен в области пространства имен.

       TEST_MODULE_CLEANUP(methodName)

Определяет метод MethodName , который запускается при выгрузке модуля.TEST_MODULE_CLEANUPможет быть определен только один раз в тестовом модуле и должен быть объявлен в области пространства имен.

Другие вопросы по тегам