2017-12-27 4 views
0

ich die folgenden zwei einfachen Methoden in einer Qt-Konsolenanwendung haben:Prüfnorm mit Signalen und Slots

void Webservice::getFile(PostElement el) 
{ 
    parameter = ⪙ 
    QUrl url(PATH); 
    QUrlQuery query; 
    query.addQueryItem(el.getParam(), el.getValue()); 
    url.setQuery(query); 
    request.setUrl(url); 
    manager->get(request); 
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, 
      SLOT(downloadCompleted(QNetworkReply*))); 
} 

void Webservice::downloadCompleted(QNetworkReply *reply) 
{ 
    QByteArray b = reply->readAll(); 
    qDebug() << "Download completed!"; 
    QFile file("/tmp/" + parameter->getValue()); 
    file.open(QIODevice::WriteOnly); 
    file.write(b); 
    file.close(); 
    reply->deleteLater(); 
} 

Ich habe ein QTest Projekt getFile Methode zu testen.

#include <QtTest> 
#include <QCoreApplication> 

// add necessary includes here 
#include "webservice.h" 

class WebserviceTest : public QObject 
{ 
    Q_OBJECT 

public: 
    WebserviceTest(); 
    ~WebserviceTest(); 

private: 
    Webservice ws; 

private slots: 
    void initTestCase(); 
    void cleanupTestCase(); 
    void getFile(); 
}; 

WebserviceTest::WebserviceTest() 
{ 

} 

WebserviceTest::~WebserviceTest() 
{ 

} 

void WebserviceTest::initTestCase() 
{ 

} 

void WebserviceTest::cleanupTestCase() 
{ 

} 

void WebserviceTest::getFile() 
{ 
    PostElement el{"file", "myPic.png"}; 
    ws.getFile(el); // it should wait for the slot to be executed 
} 

QTEST_MAIN(WebserviceTest) 

#include "tst_webservicetest.moc" 

Wie Sie sehen können, hat es Signale und Steckplätze. Wenn ich das auf meinem ursprünglichen Projekt ausführe, sehe ich, dass downloadCompleted ohne Probleme ausgeführt wird (weil es die Ereignisschleife verwendet). Aber im Testprojekt wird der Slot nicht aufgerufen. Ich habe gegoogelt und einige Beispiele mit QSignalSpy gefunden, aber im Moment habe ich den Slot nicht erfolgreich ausgeführt.

Wie kann ich meinen Test "warten", bis der Slot fertig ist?

Antwort

1

Das ist genau der Zweck von QSignalSpy, es dreht sich im Grunde neu QEventLoop, die darauf wartet, dass Signal ausgeführt wird. Ihre Tests starten und asynchroner Betrieb, aber es wartet nicht auf den Abschluss, so dass es Objekte zerstört, während der Vorgang noch läuft.

Qt-Test hat auch einige eingebaute Timeouts, die verhindern, dass Tests hängen bleiben, die gestoppt werden, wenn QSignalSpy verwendet wird. In Ihrem Fall müssen Sie ein neues Signal von Ihrer Klasse Webservice ausgeben, das anzeigt, dass der Download abgeschlossen ist, z. (Sie können auch Argumente auf das Signal passieren), falls erforderlich:

class Webservice : public QObject { 
    Q_OBJECT 
    // Constructors etc. 
    signals: 
    void finished(); 
} 

Dann am Ende Ihres void Webservice::downloadCompleted(QNetworkReply *reply):

emit finished(); 

und im Test etwas wie folgt aus:

PostElement el{"file", "myPic.png"}; 
// Prepare spy 
QSignalSpy spy(&ws, SIGNAL(finished)); 
ws.getFile(el); 
// Wait for result - by default this waits 5 seconds 
spy.wait(); 
// Check if we had a timeout or actually signal was raised 
QCOMPARE(spy.count(), 1); 
+1

Thank dich so sehr! Ich kann jetzt testen :) Ich empfehle, 'el' auf' QSignalSpy' zu 'ws' zu ändern, weil es das Signal hat – Chu

Verwandte Themen