topoden
18th December 2009, 17:22
Hello guys,
I'm trying to test my class which emits a signal where one of parameters is my custom class:
namespace MyNamespace
{
struct MyData
{
};
class MyClass : public QObject
{
Q_OBJECT
public:
...
signals:
void mySignal(const MyData &);
};
}
So my testing code looks like:
Q_DECLARE_METATYPE(MyNamespace::MyData)
namespace MyNamespace
{
class MyClassTest : public QObject
{
Q_OBJECT
public slots:
void initTestCase()
{
qRegisterMetaType<MyNamespace::MyData>("MyData"); // case 1
//qRegisterMetaType<MyNamespace::MyData>("MyNamespace::MyData"); // case 2
}
private slots:
void test_mySignal()
{
...
QSignalSpy mySignalSpy(my_object, SIGNAL(mySignal(const MyData &)));
MyData expected_data;
... // code which triggers the signal
QCOMPARE(mySignalSpy.count(), 1); // Works
QList<QVariant> mySignalResult = mySignalSpy.takeFirst();
MyData arrived_data = mySignalResult.at(0).value<MyNamespace::MyData>(); // Here I get empty data
QCOMPARE(arrived_data, expected_data);
}
};
}
1. I've put Q_DECLARE_METATYPE in order to have MyData to / from QVariant functionality working. And the following code works properly:
MyData data;
QVariant data_variant = QVariant::fromValue<MyData>(data);
MyData data_new = data_variant.value<MyData)();
2. I've put qRegisterMetaType in order to have signals / slots with MyData parameters working.
As you see I have two cases of qRegisterMetaType usage: the first case seems to make signals / slots working, but I get empty MyData from the mySignalResult; the second case leads to warning "Dont't know how to hande 'MyData'" emitted by QSignalSpy.
So the question is - what I'm doing wrong ?
I'm trying to test my class which emits a signal where one of parameters is my custom class:
namespace MyNamespace
{
struct MyData
{
};
class MyClass : public QObject
{
Q_OBJECT
public:
...
signals:
void mySignal(const MyData &);
};
}
So my testing code looks like:
Q_DECLARE_METATYPE(MyNamespace::MyData)
namespace MyNamespace
{
class MyClassTest : public QObject
{
Q_OBJECT
public slots:
void initTestCase()
{
qRegisterMetaType<MyNamespace::MyData>("MyData"); // case 1
//qRegisterMetaType<MyNamespace::MyData>("MyNamespace::MyData"); // case 2
}
private slots:
void test_mySignal()
{
...
QSignalSpy mySignalSpy(my_object, SIGNAL(mySignal(const MyData &)));
MyData expected_data;
... // code which triggers the signal
QCOMPARE(mySignalSpy.count(), 1); // Works
QList<QVariant> mySignalResult = mySignalSpy.takeFirst();
MyData arrived_data = mySignalResult.at(0).value<MyNamespace::MyData>(); // Here I get empty data
QCOMPARE(arrived_data, expected_data);
}
};
}
1. I've put Q_DECLARE_METATYPE in order to have MyData to / from QVariant functionality working. And the following code works properly:
MyData data;
QVariant data_variant = QVariant::fromValue<MyData>(data);
MyData data_new = data_variant.value<MyData)();
2. I've put qRegisterMetaType in order to have signals / slots with MyData parameters working.
As you see I have two cases of qRegisterMetaType usage: the first case seems to make signals / slots working, but I get empty MyData from the mySignalResult; the second case leads to warning "Dont't know how to hande 'MyData'" emitted by QSignalSpy.
So the question is - what I'm doing wrong ?