[solved] QtTest + Signal ?

Verschiedenes zu Qt
Antworten
Hulk2442
Beiträge: 115
Registriert: 10. Januar 2007 13:44

[solved] QtTest + Signal ?

Beitrag von Hulk2442 »

Hi
Ich schreibe gerade viele Kalkulationsklassen und würde gerne zum testen dieser die <QtTest> Funktionalität benutzen.
Jedoch nach langen lesen, suchen, versuchen bekomme ich dass Ding nicht zum laufen und würde gerne um eure Hilfe ersuchen.

Funktionalität:
1.) Die Klasse bekommt eine Daten
2.) führt eine Berechnung aus (in diesem Fall eine simple Adition)
3.) versendet ein Signal mit dem Resultat.


Bsp.:
main.cc

Code: Alles auswählen

#include <QApplication>
#include "Plus.hh"
int main(int argc, char *argv[])
{
        QApplication a(argc, argv);
        Plus p;
        p.setNumber1( 5 );        // Berechnung 1
        p.setNumber2( 5 );        // Berechnung 2
        return a.exec();
}
Plus.hh

Code: Alles auswählen

#ifndef PLUS_HH
#define PLUS_HH
#include <QObject>
class Plus : public QObject
{
        Q_OBJECT
        public:
                explicit Plus(QObject *parent = 0);
                void setNumber1( int iNumber );
                void setNumber2( int iNumber );
                void calc();                // plus
        signals:
                void calcSignal(int iResult);
        public slots:
        private:
                int iNumber1;
                int iNumber2;
};
#endif // PLUS_HH

Plus.cc

Code: Alles auswählen

#include "Plus.hh"
#include <QDebug>
Plus::Plus(QObject *parent) :
        QObject(parent),
        iNumber1( 0 ),
        iNumber2( 0 )
{
        qDebug() << "Calc";
}

void Plus::setNumber1( int iNumber )
{
        iNumber1 = iNumber;
        calc();
}
void Plus::setNumber2( int iNumber )
{
        iNumber2 = iNumber;
        calc();
}

void Plus::calc()
{
        int iResult = iNumber1 + iNumber2;
        qDebug() << "Result: " << iResult;
        emit calcSignal( iResult );
}
Ab hier komme ich nicht mehr weiter :-(

test_plus.cpp

Code: Alles auswählen

#include <QtTest/QtTest>
#include <QtTest/QSignalSpy>

#include "../plus/Plus.hh"

class TestPlus: public QObject
{
	Q_OBJECT
	
	private slots:
		void addition_data();
		void addition();
};

void TestPlus::addition_data() 	//???
{
	QTest::addColumn<int>("number");
	
	QTest::newRow("calc-1")	<< 1;
	QTest::newRow("calc-2")	<< 2;
	QTest::newRow("calc-3")	<< 3;
	QTest::newRow("calc-4")	<< 4;
	QTest::newRow("calc-5")	<< 5;
}

void TestPlus::addition() 	//???
{
	Plus plus;
	
// 	QFETCH(int, result);
	
	//QCOMPARE( plus.calc(), result);

	QSignalSpy spy( &plus, SIGNAL(calcSignal(int)) );
	
	plus.setNumber1( 5 );

	QList<QVariant> arguments = spy.takeFirst();
	QVERIFY(arguments.at(0).type() == QVariant::Int);
}

QTEST_MAIN(TestPlus)
#include "test_plus.moc"

Irgendwie stehe ich da komplett auf der Leitung und würde um Hilfe ersuchen.
Zuletzt geändert von Hulk2442 am 26. April 2013 10:30, insgesamt 1-mal geändert.
Hulk2442
Beiträge: 115
Registriert: 10. Januar 2007 13:44

Re: QtTest + Signal ?

Beitrag von Hulk2442 »

Habe die Lösung gefunden!
Unterhalb findet ihr die Funktionierende Test-Klasse

test_plus.cpp

Code: Alles auswählen

#include <QtTest/QtTest>
#include <QtTest/QSignalSpy>

#include "../plus/Plus.hh"

class TestPlus: public QObject
{
	Q_OBJECT

	private slots:
		void addition_data();
		void addition();
};



void TestPlus::addition_data()
{
	QTest::addColumn<int>("iNumber1");
	QTest::addColumn<int>("iNumber2");
	QTest::addColumn<int>("iResult1");
	QTest::addColumn<int>("iResult2");

	QTest::newRow("calc-1")	<< 1 << 1 << 1 << 2;
	QTest::newRow("calc-2")	<< 2 << 2 << 2 << 4;
	QTest::newRow("calc-3")	<< 3 << 3 << 3 << 6;
	QTest::newRow("calc-4")	<< 4 << 4 << 4 << 8;
	QTest::newRow("calc-5")	<< 5 << 5 << 5 << 10;
}



void TestPlus::addition()
{
	Plus plus;

	//create placeholder
	QFETCH(int, iNumber1);
	QFETCH(int, iNumber2);
	QFETCH(int, iResult1);
	QFETCH(int, iResult2);

	//create Storage
	QSignalSpy spy( &plus, SIGNAL(calcSignal(int)) );
	QList<QVariant> arguments;

	//emite Signal
	plus.setNumber1( iNumber1 );
	plus.setNumber2( iNumber2 );

	//compare signal activity
	QCOMPARE( spy.count(), 2 );

	//verify first result
	arguments = spy.takeFirst();
	QVERIFY( arguments.at(0).toInt() == iResult1 );

	//verify second result
	arguments = spy.takeFirst();
	QVERIFY( arguments.at(0).toInt() == iResult2 );
}


QTEST_MAIN(TestPlus)
#include "test_plus.moc"

Antworten