Избыточное объявление пространства имен в сигнале для использования QSignalSpy
Я пытаюсь утилизировать QTest
в комбинации с Catch
а также QSignalSpy
чтобы проверить мои приложения. Я должен сказать, что я использую Qt 5.10.0, что может быть важно.
Недавно я наткнулся на странное поведение, которое я не мог объяснить.
main.cpp
#include "testing/catch2.hpp"
#include <QtTest/qtest.h>
#include "TestCases.h"
TEST_CASE("MyTest") {
TestCases tc;
QTest::qExec(&tc);
}
TestCases.h
#pragma once
#include <QObject>
#include <QDebug>
#include <QSignalSpy>
#include "testing/catch2.hpp"
#include "TestObject.h"
class TestCases : public QObject {
Q_OBJECT
private slots:
void firstTest() {
nameSpace::TestObject o;
QSignalSpy s(&o, &nameSpace::TestObject::valueChanged);
o.setValue();
REQUIRE(s.size() == 1);
auto var = s.takeFirst();
CHECK(var.size() == 0);
}
void secondTest() {
nameSpace::TestObject o;
QSignalSpy s(&o, &nameSpace::TestObject::objectChanged);
o.changeObject();
REQUIRE(s.size() == 1);
auto var = s.takeFirst();
CHECK(var.size() == 1);
}
};
TestObject.h
#pragma once
#include <QObject>
namespace nameSpace
{
struct MyObject
{
};
class TestObject : public QObject {
Q_OBJECT
public:
TestObject() {
}
void setValue() {
emit valueChanged();
}
void changeObject()
{
MyObject obj;
emit objectChanged(obj);
}
signals:
void valueChanged();
// Why I need to add a namespace here?
void objectChanged(const nameSpace::MyObject&);
};
}
Q_DECLARE_METATYPE(nameSpace::MyObject);
Если я запустил опубликованный код, я получу следующий вывод, что хорошо для меня.
********* Start testing of TestCases *********
Config: Using QtTest library 5.10.0, Qt 5.10.0 (i386-little_endian-ilp32 shared (dynamic) release build; by MSVC 2015)
PASS : TestCases::initTestCase()
PASS : TestCases::firstTest()
PASS : TestCases::secondTest()
PASS : TestCases::cleanupTestCase()
Totals: 4 passed, 0 failed, 0 skipped, 0 blacklisted, 9ms
********* Finished testing of TestCases *********
===============================================================================
Но если я изменю линию void objectChanged(const nameSpace::MyObject&);
в void objectChanged(const MyObject&);
Я получаю следующий ошибочный вывод:
********* Start testing of TestCases *********
Config: Using QtTest library 5.10.0, Qt 5.10.0 (i386-little_endian-ilp32 shared (dynamic) release build; by MSVC 2015)
PASS : TestCases::initTestCase()
PASS : TestCases::firstTest()
QWARN : TestCases::secondTest() QSignalSpy: Unable to handle parameter '' of type 'MyObject' of method 'objectChanged', use qRegisterMetaType to register it.
PASS : TestCases::secondTest()
PASS : TestCases::cleanupTestCase()
Totals: 4 passed, 0 failed, 0 skipped, 0 blacklisted, 7ms
********* Finished testing of TestCases *********
===============================================================================
Поэтому необходимо включить, казалось бы, избыточное пространство имен в определение сигнала. Поиск и обнаружение этой ошибки заняло у меня полдня, и теперь я также хотел понять, что может быть причиной такого поведения. Это намеренно или Qt Bug? И если это сделано намеренно, где это находится в документации Qt.
Это как-то похоже на то, почему нужно писать
Q_DECLARE_META_TYPE(nameSpace::MyObject)
вместо
namespace nameSpace {
Q_DECLARE_META_TYPE(MyObject)
}
См. Документы: https://doc.qt.io/qt-5/qmetatype.html.