質問

私は試験中に非同期要求をウェブサーバ.そのため私を簡単にunittestを早く数行のコード:

void AsynchronousCall::testGet()
{
    QNetworkAccessManager *nam =  new QNetworkAccessManager(this);

    QUrl url("http://myownhttpserver.org");
    QNetworkRequest req(url);


    this->connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(reqFinished(QNetworkReply *)));
    QNetworkReply *rep = nam->get(req);

}

void AsynchronousCall::reqFinished(QNetworkReply *rep)
{
    qDebug() << rep->readAll();
    qDebug() << "finshed";
}

問題はreqFinished()がいます。また簡単なQEventLoopと、ループを実行します。exec()の直後には、ナム->get(req);の請求が実行されます。

他のヒント?を使用しなければいけない、ループを実行します。exec()は私の毎unittests?

役に立ちましたか?

解決

したい場合は試験の非同期行動に使QEventLoopまたはその他のクラスと同様の機能。ていただきたい書ヘルパーの方法のようになります:

bool waitForSignal(QObject *sender, const char *signal, int timeout = 1000) {
    QEventLoop loop;
    QTimer timer;
    timer.setInterval(timeout);
    timer.setSingleShot(true);

    loop.connect(sender, signal, SLOT(quit()));
    loop.connect(&timer, SIGNAL(timeout()), SLOT(quit()));
    timer.start();
    loop.exec();

    return timer.isActive();
}

を利用することができますユニットテストのようになります:

void AsynchronousCall::testGet()
{
    QNetworkAccessManager *nam =  new QNetworkAccessManager(this);

    QUrl url("http://myownhttpserver.org");
    QNetworkRequest req(url);


    this->connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(reqFinished(QNetworkReply *)));
    QNetworkReply *rep = nam->get(req);
    QVERIFY(waitForSignal(nam, SIGNAL(finished(QNetworkReply*)), 5000));
}

その他にも課題は、試験:

  1. 試験に依存しているネットワーク接続なユニット。いるユニット試験では非常に高速で実現不可能とネットワークに接続します。
  2. お試しないもん:でを一部情報デバッグです。定義する必要があ期待を行っています。用QVERIFYとQCOMPAREマクロです。
  3. QTest吸い込みまぁ.だ作成の試験ベースから利用開始 gtest + gmock です。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top