带信号和插槽的测试方法
Test method with Signals and Slots
我在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的一些示例,但是目前我尚未成功执行该插槽。
如何告诉我的测试"等待"插槽完成?
这正是QSignalSpy
的目的,它基本上旋转了新的QEventLoop
,等待信号被执行。您的测试启动和异步操作,但它不会等待它完成,因此在操作正在进行时会破坏对象。
QT测试还具有一些内置超时,可防止使用QSignalSpy
时停止的测试。在您的情况下,您需要从类Webservice
发出新信号,以表明下载完成,例如(您也可以将参数传递给信号),如果需要:
class Webservice : public QObject {
Q_OBJECT
// Constructors etc.
signals:
void finished();
}
然后在void Webservice::downloadCompleted(QNetworkReply *reply)
的末尾:
emit finished();
在您的测试中,类似的东西:
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);
相关文章:
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何在没有信号的情况下从C++执行QML插槽
- 从Q_INVOKABLE功能或插槽中更改QQuick图像源
- 升压信号2将插槽传递到成员功能以断开连接
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- C++ 信号和插槽不工作:插槽不响应事件
- NS3 插槽混淆(需要帮助理解)
- QObject::连接无法将信号连接到*this*对象的插槽
- Qt没有这样的方法插槽
- 如何将Singleton类信号连接到MainWindow类插槽或方法
- 这是在Qt信号和插槽中使用参数调用函数的好方法吗?
- 插槽(指向方法成员的指针)作为 SIP 中方法的参数
- 带信号和插槽的测试方法
- 有没有一种方法可以将升压信号和插槽与不可复制的对象一起使用
- Qt connect(*发送器,*信号,*接收器,*方法)不调用插槽
- 使用连接方法连接到插槽
- Qt-有没有一种方法可以获得一个类中所有自定义插槽和信号的列表
- Qt将GUI类中的方法连接到另一个类中的插槽
- C++ 观察者模式侦听器事件方法/类或信号和插槽
- 如何在静态方法中将信号连接到插槽