Pergunta

Gostaria de testar uma solicitação assíncrona a um servidor da web. Para esse fim, estou criando um mais simples para tentar rapidamente algumas linhas de código:

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";
}

O problema é que o reqfinished () nunca é alcançado. Se eu tivesse um qeventloop simples e um loop.exec () logo após o nam-> get (req); a solicitação é executada.

Alguma dica? Eu tenho que usar um loop.exec () em todos os meus unitests?

Foi útil?

Solução

Se você deseja testar o comportamento assíncrono, deve usar o Qeventloop ou outra classe com funcionalidade semelhante. Eu sugiro que você escreva o método auxiliar como este:

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();
}

Então você pode usá -lo em seus testes de unidade como este:

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));
}

Há também outros problemas com o seu teste:

  1. Testes que dependem da conexão de rede não devem ser testes de unidade. Você deseja que seus testes de unidade sejam rápidos, o que é impossível de alcançar com as conexões de rede.
  2. Seu teste realmente não testa nada: apenas coloca algumas informações para depurar o console. Você deve definir as expectativas e verificá -las usando o QVERIFY e o QCompare Macros.
  3. Qtest é uma merda IMHO. Se você está criando base de teste do zero, comece a usar gtest + gmock em vez de.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top