Используйте 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
может быть определен только один раз в тестовом модуле и должен быть объявлен в области пространства имен.