سؤال

أود اختبار طلب غير متزامن إلى خادم ويب. لهذا الغرض ، أقوم بإنشاء ما هو بسيط بسيط لتجربة بضعة أسطر من التعليمات البرمجية:

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

المشكلة هي أن reqfinishized () لم يتم الوصول إليها أبدًا. إذا كان لديّ QeventLoop بسيط و Loop.exec () مباشرة بعد nam-> الحصول على (req) ؛ يتم تنفيذ الطلب.

أي تلميح؟ هل يجب علي استخدام حلقة.

هل كانت مفيدة؟

المحلول

إذا كنت ترغب في اختبار السلوك غير المتزامن ، فيجب عليك استخدام 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 تمتص IMHO. إذا كنت تقوم بإنشاء قاعدة اختبار من نقطة الصفر ، فابدأ في الاستخدام GTest + Gmock في حين أن.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top