Ich versuche mich mit QtTest vertraut zu machen, habe jedoch ein Verständnisproblem.
Tests sind private slots einer Klasse, die aufgerufen werden, soweit ok.
Aber wie teste ich asynchron aufgerufene Slots?
Ich hab eine Klasse, die QUdpSockets nutzt und würde gerne nun die Funktionalität verifizieren in dem ich von einem TestSocket zu meiner Klasse kommuniziere. Dies funktioniert aber nur asynchron, sprich testsocket sendet, meine Klasse empfängt und ruft einen signal auf. Ich müsste nun eigentlich nun das testen, was von dem signal kommt, das kann ich tun in dem ich ein slot dran hänge.
Wenn QtTest jedoch private slots automatisch startet, dann hab ich doch an dieser Stelle ein Problem?
Wie Teste ich ein Socket?
-
-=Freaky=-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
Hallo,
leider nicht.
Das Beispiel aus der SignalSpy Doku hier:
Funktioniert nur in dem Fall, weil box->animateClick ein Blocking call ist, sprich die Ausführung des restlichen codes wartet, bis die Methode abgeschlossen ist.
Bei Sockets und asynchroner kommunikation kann der obige code nicht garantieren, dass QCOMPARE(spy.count(), 1); erst dann erfolgt, wenn clicked ausgeführt worden ist (bezogen auf sockets, nicht auf click)
leider nicht.
Das Beispiel aus der SignalSpy Doku hier:
Code: Alles auswählen
QCheckBox *box = ...;
QSignalSpy spy(box, SIGNAL(clicked(bool)));
// do something that triggers the signal
box->animateClick();
QCOMPARE(spy.count(), 1); // make sure the signal was emitted exactly one time
QList<QVariant> arguments = spy.takeFirst(); // take the first signal
QVERIFY(arguments.at(0).toBool() == true); // verify the first argumentBei Sockets und asynchroner kommunikation kann der obige code nicht garantieren, dass QCOMPARE(spy.count(), 1); erst dann erfolgt, wenn clicked ausgeführt worden ist (bezogen auf sockets, nicht auf click)
-
-=Freaky=-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
ja da hast du recht.
ich hab sowas mal ganz provisorisch via
gemacht, aber optimal ist das wohl nicht ...
mfg,
julian
ich hab sowas mal ganz provisorisch via
Code: Alles auswählen
while( mySignalSpy.count() < 1 )
QThread::msleep( 10 /* oder wieviel auch immer */ );mfg,
julian
-
-=Freaky=-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
ich habe eine von QThread abgeleitete klasse.
die stellt eine static public methode msleep(unsigned long msec), in welcher wiederrum QThread::msleec( msec ) aufgerufen wird.
ist btw. nicht ganz auf meinem eigenen mist gewachsen, funktioniert aber gut.
// edit: der code, den ich oben gepostet habe, ist also quasi nur pseudo-code, QThread::msleep funktionert so natuerlich nicht.
mfg,
julian
die stellt eine static public methode msleep(unsigned long msec), in welcher wiederrum QThread::msleec( msec ) aufgerufen wird.
ist btw. nicht ganz auf meinem eigenen mist gewachsen, funktioniert aber gut.
// edit: der code, den ich oben gepostet habe, ist also quasi nur pseudo-code, QThread::msleep funktionert so natuerlich nicht.
mfg,
julian