信号和插槽的测试方法

时间:2017-12-27 20:37:18

标签: c++ qt qt5 qtestlib

我在Qt控制台应用程序中有以下两种简单方法:

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

我创建了一个QTest项目来测试getFile方法。

#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"

如您所见,它有信号和插槽。如果我在原始项目中运行那个,我会看到downloadCompleted执行没有问题(因为它正在使用事件循环)。但是在测试项目中,不会调用插槽。我用谷歌搜索并找到了一些使用QSignalSpy的例子,但目前我没有成功执行插槽。

如何告诉我的测试“等待”插槽完成?

1 个答案:

答案 0 :(得分:1)

这正是10000040 1-120 10000040 541-660 10000042 1-120 10000043 541-660 10000048 1-120 10000049 1-120 10000049 181-300的目的,它基本上会旋转等待信号执行的新QSignalSpy。您的测试开始并且异步操作但它不会等待它完成,因此它会在操作正在进行时破坏对象。

Qt测试还有一些内置超时功能,可防止在使用QEventLoop时停止测试。在您的情况下,您需要从您的班级QSignalSpy发出新信号,表明下载已完成,例如(如果需要,你也可以将参数传递给信号):

Webservice

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

的末尾
void Webservice::downloadCompleted(QNetworkReply *reply)

并在你的测试中这样:

emit finished();